"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
class Printer implements Runnable
{
public void run()
{
System.out.println("I’m printer");
}
}
Klass som implementerar gränssnittet Runnable .
public static void main(String[] args)
{
Printer printer = new Printer();
Thread childThread = new Thread(printer);
childThread.start();
}
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."

Skapa och starta nya trådar - 1

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
class Printer implements Runnable
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
Klass som implementerar gränssnittet Runnable.
public static void main(String[] args)
{
Printer printer1 = new Printer("Nick");
Thread thread1 = new Thread(printer1);
thread1.start();

Printer printer2 = new Printer("Jack");
Thread thread2 = new Thread(printer2);
thread2.start();
}
Skapa två trådar, som var och en kommer att baseras på sitt eget skrivarobjekt.
public static void main(String[] args)
{
Printer printer = new Printer("Natasha");

Thread thread1 = new Thread(printer);
thread1.start();

Thread thread2 = new Thread(printer);
thread2.start();

Thread thread3 = new Thread(printer);
thread3.start();
}
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
class Printer extends Thread
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
Ärva klassen Thread , som implementerar Runnable- gränssnittet, och åsidosätt sedan körningsmetoden .
public static void main(String[] args)
{
Printer printer = new Printer("Jack");
printer.start();

Printer printer2 = new Printer("Jack");
printer2.start();

}
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?"

Koda
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() ."