2016-04-22 15 views
-2

スレッドがisAlive、joinなどの組み込み関数を使用せずに実行を完了したことを知ることは可能ですか? スレッドA、B、Cが並行して実行されているとします。それで、すべてのスレッドが実行を完了したかどうかを知る方法。スレッドの実行

+4

なぜあなたは 'join'以外のものを使用したいのでしょうか? – Savior

+2

'if'を使うことができますか、それとも組み込みですか? – shmosel

+1

run()メソッドが...の終わりにフラグを立てるために...を返した後にスレッドがその実行を終了することを考えれば、別の方法があります。それでもあなたの目標は何ですか? @ shmosel。 –

答えて

0

CountDownLatchを使用すると、それを手助けすることができます。クラス名であなたの実行方法でそう

class ClassName implements Runnable 
{ 
    private CountDownLatch latch; 

    //constructor: 
    ClassName(CountDownLatch latch) 
    { 
     this.latch = latch; 
    } 

    //run method: 
    @Override 
    void run() 
    { 
     //Your thread code... 

     latch.countDown(); 
    } 
} 

: あなたが

 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 

のようなものを作ることができますそして、あなたのクラス名で、あなたがこのような何かを持っている必要がありますので、のは、あなたがExecutorServiceのでスレッドを作っているとしましょうlatch.countDown()を呼び出す必要があります。

CountDownLatchは自動的に同期化されるため、そのことについて考える必要はありません。

ラッチを使用するためにExectuorServiceを使用する必要はありませんが、これは単なる例です。

+0

threadsCountは明らかに、スレッド数を表す整数です。 – user1478293

+0

スレッドが実行を完了したときに本当に〜について質問しているなら、これは実行しません。特に、複数の 'Runnable'に対して同じスレッドを維持する' ExecutorService'では特にそうではありません。 – Savior

+0

次に、質問を正しく理解しているか、実際には何を意味するのか分かりません。基本的にスレッドが終了した時点を知りたければ、これは実際に動作します。 – user1478293

0

さて、あなたは実質的に悪いアイデアを求めていることから、ここでは逆方向に、非決定論的なソリューションです:

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

ご協力いただきありがとうございます。しかし、それは悪い考えではありません。このような質問をする人もいます。そして、私の友人はこの質問をインタビュー – userLearning

+0

@userLearningで得ました。その場合、あなたの答えはここにあります。それは、タスク14が完了したかどうかを確認する方法が問題ではありますが、ユーザー1478293の回答に従ってください。 – shmosel

関連する問題