"Hej, Amigo! Ellie berättade om trådar, och jag ska berätta hur du arbetar med dem. För att skapa en ny tråd måste du:"
1) Skapa ett trådobjekt
2) Skicka den metod du vill köra
3) Anropa startmetoden på det skapade trådobjektet.
Tänk på det här exemplet:
Koda | Beskrivning |
---|---|
|
Klass som implementerar gränssnittet Runnable . |
|
1 Skapa en instans av klassen Printer, som implementerar körmetoden. 2 Skapa ett nytt trådobjekt. Vi skickar konstruktorn skrivarobjektet, vars run()-metod måste anropas. 3 Starta den nya tråden genom att anropa start() -metoden. |
Små Java-program består vanligtvis av en tråd som kallas "huvudtråden". Men program lanserar oftare ytterligare trådar, som kallas "barntrådar". Huvudtråden kör huvudmetoden och slutar. Körningsmetoden för Runnable är den analoga metoden för underordnade trådar .
"Ah, många trådar betyder många huvudmetoder."

För att tala om för ett Thread-objekt vilken specifik metod det ska starta måste vi på något sätt skicka en metod till det. I Java görs detta med gränssnittet Runnable . Det här gränssnittet innehåller en enda abstrakt metod: void run() . Thread-klassen har en Thread(Runnable Runnable) -konstruktor. Du kan skicka in vilket objekt som helst som implementerar Runnable -gränssnittet.
Din klass måste ärva Runnable och åsidosätta dess körningsmetod . Att åberopa denna metod är det som startar den nya tråden. Du kan skriva vad du vill i körmetoden .
Koda | Beskrivning |
---|---|
|
Klass som implementerar gränssnittet Runnable. |
|
Skapa två trådar, som var och en kommer att baseras på sitt eget skrivarobjekt. |
|
Skapa tre trådar baserade på ett enda skrivarobjekt. |
Dessutom kan du kombinera allt detta i en klass. Trådklassen ärver det körbara gränssnittet , så du behöver bara åsidosätta dess körningsmetod:
Ett annat sätt att skapa en ny tråd | |
---|---|
|
Ärva klassen Thread , som implementerar Runnable- gränssnittet, och åsidosätt sedan körningsmetoden . |
|
Skapa två trådar, som var och en kommer att baseras på sitt eget skrivarobjekt . |
"Det här är en mer elegant lösning."
"Ja, men det har sina brister:"
1) Du kan behöva starta flera trådar baserat på ett enda objekt, som i exemplet med Natasha.
2) Om du ärver från trådklassen kan du inte lägga till ytterligare en förälderklass till din klass.
3) Om din klass har en föräldraklass kan du inte lägga till Tråd som en andra förälderklass.
"Med andra ord, efter att startmetoden anropats börjar var och en av trådarna köra körmetoden för objektet som skickas till konstruktorn?"
"Ja. Om inget skickas till konstruktorn, kör Thread bara sin interna körningsmetod."
"Men varför kallar vi inte metoden så här?"
public static void main(String[] args)
{
Printer printer1 = new Printer("Nick");
printer1.run();
}
"När huvudtråden når körmetoden går dess "lilla robot" helt enkelt in och utför alla kommandon inuti den. Först efter att de har utförts kommer den att återgå till huvudmetoden och fortsätta att utföra ytterligare kommandon. Således, ingen sekund " liten robot" kommer att skapas. Allt arbete kommer att utföras sekventiellt, inte parallellt (samtidigt)."
"Jag förstår. Kan du kalla någon annan metod, något annat än att springa?"
"Nej. Allt är knutet till Runnable-gränssnittet, som bara "vet" om en av dess metoder: run() ."
GO TO FULL VERSION