2015-02-11 9 views
6

Soweit ich weiß, helfen Executors bei der Ausführung von Runnables. Z.B. Ich würde wählen, einen Executor zu verwenden, wenn ich mehrere Worker-Threads habe, die ihre Arbeit erledigen und dann beenden. Der Executor würde die Erstellung und die Beendigung der Threads behandeln, die zum Ausführen der Worker-Runnables erforderlich sind.Ist hier der Thread, der dem Executor vorgezogen werden soll?

Aber jetzt bin ich mit einer anderen Situation konfrontiert. Eine feste Anzahl von Klassen/Objekten soll ihren eigenen Thread einkapseln. So wird der Thread bei der Erstellung dieser Objekte gestartet und der Thread wird für die gesamte Lebensdauer dieser Objekte weiter ausgeführt. Die wenigen Objekte werden wiederum am Anfang des Programms erstellt und existieren für die gesamte Laufzeit. Ich schätze Threads sind in dieser Situation den Executors vorzuziehen, aber wenn ich das Internet lese, scheint jeder in jeder möglichen Situation Executors über Threads zu verwenden.

Kann mir bitte jemand sagen, ob ich Executors oder Threads hier wählen möchte und warum?

Danke

+0

Was werden diese Fäden während ihrer Lebensdauer tun ? Werden sie zu 100% damit beschäftigt sein, Dezimalzahlen von Pi zu berechnen, oder werden sie bis zur Interaktion inaktiv sein? – aioobe

+0

es hängt ... einige von ihnen werden etwa 50% Leerlaufzeit haben, andere nur etwa 10% – flxh

+0

... noch andere werden 100% beschäftigt Computing Hashes von Bäumen sein. – flxh

Antwort

1

Ohne mehr über den Kontext zu wissen, ist es schwer, eine gute Antwort zu geben, aber im Allgemeinen würde ich sagen, dass die Situationen, die die Verwendung von Thread erfordern, ziemlich selten sind. Wenn Sie versuchen, Ihr Programm "manuell" mit synchronized zu synchronisieren, wette ich, dass die Dinge schnell außer Kontrolle geraten werden. (Ganz zu schweigen davon, wie schwer es wird, den Code zu debuggen.)

Letztes Mal habe ich einen Thread benutzt, als ich etwas Audio im Hintergrund aufnehmen wollte. Es war ein "Start"/"Stopp" -Sache und nicht "aufgabenorientiert". (Ich versuchte lange und schwer, eine Audiobibliothek zu finden, die das für mich einkapselte, aber fehlschlug.)

Wenn Sie sich für eine Thread-Lösung entscheiden, schlage ich vor, Sie versuchen, den Umfang des Threads zu beschränken nur innerhalb des zugehörigen Objekts ausführen. Dies wird so weit wie möglich vermeiden, Sie dazu zu zwingen, über Ereignisse nachzudenken - vor Beziehungen, Thread-sicheres Veröffentlichen von Werten usw. im gesamten Code.

+0

"Wenn du versuchst, dein Programm manuell zu synchronisieren, benutze das Synchronisieren, dann würde ich sagen, du bist auf wirklich dünnem Eis." Warum also? Irgendwelche Hinweise, um das zu unterstützen? –

+0

Das Java-Memory-Modell ist extrem haarig und denkt im Hinblick auf Ereignisse, bevor Beziehungen schnell außer Kontrolle geraten. In fast jeder Situation sollten Sie versuchen, auf einer höheren Abstraktionsebene zu arbeiten, indem Sie die von java.util.concurrent bereitgestellten Klassen verwenden. – aioobe

+0

aktuell synchronisiere ich mein Programm "manuell" unsynchronisiert. Was wäre eine Alternative? – flxh

3

Sie sind etwas Mischen Dinge. Executor ist nur eine Schnittstelle. Thread ist eine Kernklasse. Es gibt nichts, was direkt impliziert, dass Executor Implementierungen Aufgaben in separaten Threads ausführen.

Lesen Sie die ersten Zeilen des JavaDoc.

Executor

Also, wenn Sie die volle Kontrolle wollen, verwenden Sie einfach Thread und Dinge tun, auf eigene Faust.

+0

Er denkt vermutlich über ExecutorServices und Executors wie ThreadPoolExecutor nach. – aioobe

+0

@aioobe Ja, ich weiß. Aber das ist nur eine Möglichkeit, darüber nachzudenken. –

+0

Sorry für diese Verwirrung. Aber ja, wie aioobe sagt, dass ich auf ExecutorServices verwiesen habe. – flxh

1
  • ExecutorService kann Thread-Pool haben

Es Leistung optimiert, weil ein Thread zu schaffen teuer ist.

  • ExecutorService hat Lebenszykluskontrolle

shutdown(), shutdownNow() usw. vorgesehen sind.

  • ExecutorService ist flexibel

Sie Vielzahl von Verhaltensweisen berufen könnten: anpassen ThreadFactory, Set-Thread-Pool Größe, Verzögerungsverhalten ScheduledThreadPoolExecutor etc ...

Verwandte Themen