2017-08-29 1 views
1

Normalerweise, wenn eine Aufgabe an einen Thread-Pool vorgelegt wird (sagen wir mal, ein Fork-Join-Pool), nimmt er den Faden, an dem es läuft, bis er abgeschlossen ist. Wenn also die Aufgabe warten muss, um beispielsweise eine Future abzuschließen, wird der Thread beibehalten. Dies kann unerwünscht sein, wenn viele solcher Aufgaben warten; Dann werden viele Threads in die Warteschleife gelegt. Nicht nur verbraucht dies viel Speicher, aber im schlimmsten Fall können Sie die Grenze erreichen und keine neuen Threads nicht schaffen kann jeder zu einem Deadlock führen (zum Beispiel auf meinem macbook, kann ich nicht schaffen mehr als ein paar tausend Fäden in JVM).Java/Scala ThreadPool: Wie kann man einen Thread während des Wartens freigeben?

Man kann argumentieren, dass das Problem durch Ändern meines Programms gelöst werden kann, um dieses Szenario zu vermeiden, aber sehr wahrscheinlich kommt es auf Kosten meines Programm weniger lesbar und langwierig.


Meine Frage ist, wenn es in irgendeiner Weise möglich ist, ein Verfahren release dass gibt den Faden, so dass der Thread zu implementieren kann eine andere Aufgabe aus der Warteschlange zu holen verwendet werden, und planen Sie den Rest der Methode als neue Aufgabe? Also hatte ich gehofft, dies vielleicht durch Reflexion zu tun, konnte aber nicht herausfinden, wie.

Annahmen In meinem Fall kann man nur Runnable s (also kein Rückgabewert) annehmen. Es gibt auch keinen Aufruf-Stack, um den man sich kümmern muss, d. H. Das Freigeben geschieht direkt in der Methode, die die Aufgabe darstellt, die an den Thread-Pool gesendet wird.

// some code 
while (! future.isDone()){ 
    return; 
} 
// continue with the logic 

Antwort

0

Java Threads nativen Threads Karte 12.59 und was Sie fragen, ist nicht möglich:

Eine vereine Nutzung so sein würde. Effektiv fordern Sie etwas wie Fortsetzungen oder grüne Fäden/Korotinen. Es gibt einige Einschränkungen für solche Ansätze und sie sind derzeit nicht sehr beliebt. Ein Beispiel, das auf JVM existiert, ist Kotlin coroutines.

In reinem Java können Sie diesen Teil des Codes asynchron machen und CompletableFuture.thenAccept oder andere zusammensetzbare Methoden verwenden, um die weitere Verarbeitung zu planen, nachdem die ursprüngliche Zukunft abgeschlossen ist. Ähnlich hat Scala noch eine reichere Bibliothek von Zukünften und Versprechen. Eine andere Möglichkeit besteht darin, Ihre Logik aufzuteilen und Teile des Codes als Aufgaben an eine Instanz zu senden.

+0

der Tat ist es wie Fortsetzungen. Lass mich Kotlin überprüfen und sehen, wie das mein Problem lösen könnte. – Mahdi

Verwandte Themen