Ist es möglich zu wissen, wann der Thread seine Ausführung abgeschlossen hat, ohne eine der integrierten Funktionen wie isAlive, Join zu verwenden. Angenommen wir haben 3 Threads A, B und C, die parallel laufen. Also, wie man weiß, ob alle Threads ihre Ausführung abgeschlossen haben.Threads Execution
Antwort
Sie können CountDownLatch verwenden, um Ihnen dabei zu helfen. Sagen wir, Sie machen Fäden mit ExecutorService, so dass Sie so etwas wie
CountDownLatch latch = new CountDownLatch(threadsCount);
ExecutorService executor = Executors.newFixedThreadPool(threadsCount);
for (int x = 0; x < threadsCount; x++)
{
executor.submit(new ClassName(latch));
}
try
{
latch.await();
}
catch (Exception ignored){}
//all threads are done at this point
Und in Ihrem Klassenname machen könnten, sollten Sie so etwas wie dieses:
class ClassName implements Runnable
{
private CountDownLatch latch;
//constructor:
ClassName(CountDownLatch latch)
{
this.latch = latch;
}
//run method:
@Override
void run()
{
//Your thread code...
latch.countDown();
}
}
So in Ihrer Lauf Methode in Class , müssen Sie latch.countDown() aufrufen.
CountDownLatch wird automatisch synchronisiert, so dass Sie nicht darüber nachdenken müssen.
Um Latch zu verwenden, müssen Sie den ExecutorService nicht verwenden, dies war nur ein Beispiel.
threadsCount ist offensichtlich eine Ganzzahl, die übrigens die Anzahl der Threads repräsentiert. – user1478293
Wenn sie wirklich nach _Wenn der Thread seine Ausführung abgeschlossen hat, wird dies nicht tun, vor allem nicht mit einem 'ExecutorService', der den gleichen Thread für mehrere 'Runnable's verwaltet. – Savior
Dann bin ich mir nicht sicher, ob ich die Frage richtig verstehe oder was du eigentlich meinst. Wenn Sie wissen wollen, wann ein Thread im Grunde erledigt ist, wird es funktionieren. – user1478293
Nun, da Sie praktisch sind für schlechte Ideen gefragt, hier ist eine nach hinten, nicht deterministische Lösung:
public static void main(String[] args) {
Thread t1 = new Thread(() -> System.out.println("t1"));
t1.start();
WeakReference<Thread> r1 = new WeakReference<Thread>(t1);
t1 = null;
Thread t2 = new Thread(() -> System.out.println("t2"));
t2.start();
WeakReference<Thread> r2 = new WeakReference<Thread>(t2);
t2 = null;
while (r1.get() != null || r2.get() != null) {
System.gc();
}
System.out.println("done!");
}
Danke für Ihre Hilfe. Aber es ist keine schlechte Idee. Manche Leute können solche Fragen bekommen. Und mein Freund hat diese Frage im Interview – userLearning
@ userLearning, in diesem Fall, hier ist Ihre Antwort. Obwohl es viel wahrscheinlicher ist, war die Frage, wie man überprüft, ob die * Aufgabe * abgeschlossen ist, wie die Antwort von Benutzer1478293 lautet. – shmosel
- 1. NumberFormat Execution
- 2. Dynamische Bytecode Execution
- 3. Hystrix Execution Patterns
- 4. Javascript Execution Ausgabe
- 5. symfony2 - Get execution time
- 6. Firefox Extension Execution Priority
- 7. CUDA Warp Execution Efficiency
- 8. Distributed Program Execution Manager
- 9. Powershell: Execution Policy
- 10. Fatal Execution Engine Fehler
- 11. Concurrent Job Execution in Spark-
- 12. Break Execution Loop innerhalb Gdb
- 13. Force Execution Ergebnis IN SSIS
- 14. Quellcode für Kie-Execution Server
- 15. Tornado Execution Order Spawn Callback
- 16. Set sqlAuthCookie für SSRS Execution Service
- 17. Execution Error, Rückgabecode 1 von org.apache.hadoop.hive.ql.exec.MapRedTask
- 18. Ist T-SQL Stored Procedure Execution 'atomar'?
- 19. SQL Server-Replikation - Stored Procedure Execution
- 20. SQL Server Execution Plan durch SMO erhalten?
- 21. Schwerwiegender Execution Engine-Fehler (79FFEE24) (80131506)
- 22. Offener Standard Business Process Execution Language
- 23. Android Execution für Task fehlgeschlagen app: proguardRelease
- 24. stack execution protection und randomization auf ubuntu
- 25. Execution Efficiency vs Programmierer Efficiency in R
- 26. Ist .NET Execution Environment (DNX) mono ähnlich?
- 27. Was heißt {$ {phpinfo()}}? (Remote Command Execution bezogen)
- 28. Anwendungs-Threads vs. Service-Threads
- 29. Leistungsproblem wegen blockierter Threads
- 30. CUDA: Was unterscheidet Threads pro Multiprozessor und Threads pro Block?
Warum würden Sie wollen etwas anderes benutzen als 'join'? – Savior
Können wir ein 'if' verwenden, oder ist das zu eingebaut? – shmosel
Eine Alternative könnte sein, wenn ein Thread seine Ausführung beendet, nachdem die Methode run() das Ende zurückgibt. Aber was ist dein Ziel? –