Frage

Ich bin auf der folgenden verwirrt:
Um Threads in einem Java-Programm zu verwenden, ist der einfachste Weg, Thread-Klasse zu erweitern und die runnable Schnittstelle implementieren (oder einfach implementieren runnable).
So starten Sie die Ausführung des Thread. Wir müssen das Verfahren Anfang des Gewinde () aufrufen, die wiederum Methode run () des Threads aufruft. Und so den Faden beginnt.
Die Methode start () (es sei denn, ich falsch bin) muss genau bezeichnet werden und nur einmal für jeden Thread. Als Ergebnis können nicht Thread-Instanzen wiederverwendet werden, wenn irgendwie die run-Methode selbst in einem gewissen kurzen des Endlosschleife läuft, die eine benutzerdefinierte Implementierung des reusage Thread erleichtert.
Nun ist die javadoc

War es hilfreich?

Lösung

Beachten Sie, dass es nicht, dass die Anrufe Executor start() - es ist ExecutorService. Und nein, es ist nicht zweimal rufen start(). Es ist nicht die Aufgabe beginnen, dass Sie geben Thread.start() direkt mit ... statt, es beginnt einen Faden, der über den Thread-Pools der Warteschlange der Arbeit kennt. Der Thread wartet im Grunde, bis es einige Arbeit zu tun ist, ist es dann abholen und führen Sie es aus, bevor zu warten zurück. Obwohl also der Faden erfüllt mehrere Aufgaben wird Thread.start() nur einmal genannt.

EDIT:. Gemessen an den Kommentaren, du bist ein bisschen verwirrt über den Unterschied zwischen einem Runnable (das ist eine Aufgabe ausgeführt werden soll) und eine Thread (das ist, was Aufgaben ausführt)

Der gleiche Thread kann mehrere Aufgaben ausführen. Für ein sehr einfaches Beispiel eines Thread-Pool nicht verwenden, bedenken Sie:

public class MultiRunnable implements Runnable
{
    private final List<Runnable> runnables;

    public MultiRunnable(List<Runnable> runnables)
    {
        this.runnables = runnables;
    }

    public void run()
    {
        for (Runnable runnable : runnables)
        {
             runnable.run();
        }
    }
}

(ignorieren die potentiellen Sicherheitsfaden Ausgaben eines List<T> von mehreren Threads verwenden.)

Sie können eine ganze Reihe von Runnable Aufgaben dazu in der Lage verschiedene Dinge erstellen, erstellen dann eine einzelne MultiRunnable sie wiederum zu laufen. Führen Sie diese Instanz von MultiRunnable in den Thread Konstruktor, und dann, wenn Sie den Thread starten, wird es jeder der ursprünglichen runnable Aufgaben auszuführen. Hat diese Hilfe?

Andere Tipps

Es ruft nicht start () mehr als einmal; statt der Thread in dem Pool wird nie abgeschlossen, sondern nur am Leben bleibt --- wartet. Der Quellcode steht zum Download bereit, wenn man es suchen.

Jeder Thread in dem Threadpool kann für den Executor einfach wait() es zur Hand ein neues Runnable, aber der eigene run() Methode des Thread ist nicht abgeschlossen. Er wartet einfach für eine neue Runnable zum Exekutor gegeben werden.

„Start“ ein Thread mehr als einmal, um ein lauffähiges zu erstellen. Zum Beispiel:

//NO
private class T extends Thread { //not necessary to implement runnable
    public void run(){
        //...
    }
}
void someMethod(){
    T a = new T();
    a.start();
    a.start(); //NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO
}

Stattdessen

//Yes
private class T implements Runnable {
    public void run(){
        //...
    }
}
void someMethod(){
    T a = new T();
    new Thread(a).start();
    new Thread(a).start(); //YES YES YES
}

Es ist auch möglich, dies zu tun:

void someMethod(){
    final Runnable r = new Runnable(){
        public void run(){
            //...
        }
    };
    new Thread(r).start();
    new Thread(r).start();
}
// r could also be a field of you class. 
scroll top