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
der Tat ist es wie Fortsetzungen. Lass mich Kotlin überprüfen und sehen, wie das mein Problem lösen könnte. – Mahdi