2010-06-06 5 views
13

Ich baue eine Konsole Sudoku Solver, wo das Hauptziel die rohe Geschwindigkeit ist.Wie kann ein Thread in Java wiederverwendet werden?

Ich habe jetzt einen ManagerThread, der WorkerThreads startet, um die Neibhbors jeder Zelle zu berechnen. Daher wird momentan für jede Zelle ein WorkerThread gestartet. Wie kann ich einen vorhandenen Thread, der seine Arbeit beendet hat, erneut verwenden?

Das Thread-Pool-Muster scheint die Lösung zu sein, aber ich verstehe nicht, was zu tun ist, um zu verhindern, dass der Thread stirbt, sobald seine Arbeit abgeschlossen ist.

ps: Ich erwarte nicht, dass ich viel Leistung für diese spezielle Aufgabe bekomme, ich möchte einfach nur experimentieren, wie Multi-Threading funktioniert, bevor ich es auf komplexere Teile des Codes anwenden kann.

Dank

+1

Weitere Untersuchungen darüber, wie es funktioniert: http://stackoverflow.com/questions/2324030/java-thread-reuse -stackoverflow – Eddy

Antwort

14

Haben Sie einen Blick auf die Java SE java.util.concurrent API bereitgestellt. Sie können einen Threadpool mit Executors#newFixedThreadPool() erstellen und Aufgaben mit den Methoden ExecutorService übermitteln. Keine Notwendigkeit, Ihren eigenen Threadpool neu zu erfinden. Siehe auch die Sun tutorial on the subject.

+0

+1 (wie üblich) ... –

+2

@David: Denken Sie daran, dass für reine Rechenaufgaben mehr Threads zur Verfügung stehen, als es Kerne gibt, die Ihren Code verlangsamen, anstatt ihn zu beschleunigen. Offensichtlich ändert sich das, wenn Sie einen Thread für I/O oder etwas blockieren. –

+4

@ T.J. hat einen guten Punkt. @David, überprüfe ['Runtime # availableProcessors()'] (http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#availableProcessors%28%29). – BalusC

3

Bei der Verwendung eines Thread-Pools (java.util.concurrent) haben Sie nie einen Thread initialisiert, sondern Runnables an den Thread-Pool übergeben. Sie müssen sich keine Sorgen über den Lebenszyklus des Threads machen, tun Sie einfach die Arbeit, die Sie im runnable tun müssen, und lassen Sie sie, wenn sie fertig ist.

0

Nun, wenn ich diese Logik mein selbst codieren müsste, anstatt ein Paket wie Quartz von OpenSymphony zu verwenden, würde ich folgendes tun: Ich hätte einen WorkerThread, der Thread erweitert. Diese Klasse hat auch eine private Eigenschaft namens runnable, die Runnable ist. Diese Eigenschaft enthält einen Verweis auf den Code, den Sie ausführen möchten. Habe einen öffentlichen Setter dafür. Der Haupt-Thread-Code beginnt mit der Ausführung des Runnable, mit dem Sie ihn initialisiert haben, und wechselt dann in einen Wartezustand. Zuvor wird dem Pool-Manager angezeigt, dass er beendet wurde und an den Pool zurückgegeben werden kann. Wenn Sie das nächste Mal einen Thread benötigen, wählen Sie einen aus dem Pool aus, rufen setRunnable auf, das die Eigenschaft runnable setzt, und weckt dann den Thread auf. Es wird zur Arbeit zurückkehren, in die Endlosschleife eintreten: execute und runnable und zurück in den Wartezustand gehen.