Ich bin auf dem folgenden verwirrt:
Um Threads in einem Java-Programm zu verwenden, ist die einfachste Möglichkeit, Thread-Klasse zu erweitern und implementieren Sie die ausführbare Schnittstelle (oder einfach Runnable implementieren).
Um die Ausführung des Threads zu starten. Wir müssen die Methode start() des Threads aufrufen, die wiederum die Methode run() des Threads aufruft. Und so beginnt der Thread.
Die Methode start() (es sei denn, ich liege falsch) muss genau und nur einmal für jeden Thread aufgerufen werden. Daher können Thread-Instanzen nicht erneut verwendet werden, es sei denn, die run-Methode selbst läuft in einer Endlosschleife, die eine benutzerdefinierte Implementierung der Wiederverwendung des Threads erleichtert.
Nun ist die javadoc link text sagtJava-Thread-Wiederverwendung über Executor
Anrufe werden zuvor konstruierten Threads auszuführen wiederverwenden, wenn verfügbar
Ich verstehe nicht, wie dies umgesetzt wird. Ich biete in der Execute-Methode der Executor-Methode meinen benutzerdefinierten Thread z.
ExecutorService myCachedPool = Executors.newCachedThreadPool();
myCachedPool.execute(new Runnable(){public void run(){
//do something time consuming
}});
Wie kann dieser benutzerdefinierte Thread, den ich an das Executor-Framework delegiere, wiederverwendet werden?
Ist Executor erlaubt, Methode start() mehr als 1 Mal aufzurufen, während wir in unseren Programmen nicht können? Habe ich etwas falsch verstanden?
Vielen Dank.
@ Jon: Sorry, ich dich verloren. Also werden die internen Threads des Frameworks wiederverwendet und nicht das ausführbare Runnable als Argument zur Ausführung? Mein Thread, den ich an das Framework delegiere, wird jedes Mal neu instanziiert, aber von der gleichen Instanz des internen Threads, der vom Framework erstellt wird? – Cratylus
@ user384706: Ja. Ihr lauffähiges * ist kein * Thread - es ist nur eine auszuführende Aufgabe. Sie müssen zwischen den beiden unterscheiden; Sie sind sehr verschieden. –
@Jon: Vielen Dank. Das einzige, was ich nicht sicher bin, ist, was ist der Vorteil der Verwendung der Executors.newCachedThreadPool(); Wenn meine Klasse, die Runnable (für eine Aufgabe) implementiert, teuer instanziiert wird, wird sie nicht wiederverwendet und derselbe Thread des Frameworks verwendet weiterhin neue Instanzen der Aufgabe. Was würde ich von dieser API gewinnen? Es sei denn, das Konzept besagt, dass jede Klasse, die Runnable implementiert, minimal ist. – Cratylus