2016-04-22 9 views
-2

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

+4

Warum würden Sie wollen etwas anderes benutzen als 'join'? – Savior

+2

Können wir ein 'if' verwenden, oder ist das zu eingebaut? – shmosel

+1

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? –

Antwort

0

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.

+0

threadsCount ist offensichtlich eine Ganzzahl, die übrigens die Anzahl der Threads repräsentiert. – user1478293

+0

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

+0

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

0

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!"); 
} 
+0

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

+0

@ 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