2016-03-30 7 views
2

おそらくそれは簡単ですが、どのようにすればよいか分かりません。スレッドコンテキストを取得するjava

最初に、エグゼキュータでクラスB(ランナブル)を1つ以上作成するクラスAを持っています。 各クラスBはいくつかのタスクを実行する必要がありますが、各スレッドが終了した時点を知りたいと思います。

Class A { 
    private ScheduledExecutorService scheduler; 
    private int nbThread=3; 
    public A(){ 
     scheduler = Executors.newScheduledThreadPool(nbThread); 
    } 

    public start(){ 
     for (int i = 0; i < nbThread; i++) { 
      scheduler.execute(new B(); 
     } 
    } 

}

Class B implement Runnable { 

    public B(){ 

    } 

    @Override 
    public void run(){ 
     System.out.printl("test"); 
    } 

}

今、私が欲しいもの、それらの3つのスレッドがそれぞれ1(System.out.printlnは( "テスト") もし印刷する場合にのみ、他のタスクを実行することです 私はJavaであまり強くないので、いくつかの助けが必要です。 ありがとう

+0

あなたは[加入?]アウトしようとしている(https://docs.oracle.com/javase/tutorial/essential/concurrency/join。 html) –

+0

いいえ、あなたはそれは良い解決策だと思いますか?私は未来、どんな考えを探していますか?ありがとう – Caroline

答えて

3

あなたは何をしたいですか?で見るにはFuture Javaの同時パッケージのインターフェイスです。

startメソッドを更新して、使用方法の例を示しました。

public void start() { 
    Future<?>[] futures = new Future[nbThread]; 

    for (int i = 0; i < nbThread; i++) { 
     futures[i] = scheduler.submit(new B()); 
    } 

    for (int i = 0; i < nbThread; i++) { 
     try { 
      futures[i].get(); // waits until the current B is done, and then just returns null 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    // All futures now finished executing 
} 

更新:代替ソリューションあなたは、常にすべてのタスクが完了するまで待機する場合はExecutorService.invokeAllを使用することです。次の例のように(私はCallableを実装するためにBを変更することに注意してください。

class A { 
    private ScheduledExecutorService scheduler; 
    private int nbThread = 3; 

    public A() { 
     scheduler = Executors.newScheduledThreadPool(nbThread); 
    } 

    public void start() { 
     List<Callable<Object>> callables = new ArrayList<>(); 
     callables.add(new B()); 
     callables.add(new B()); 
     callables.add(new B()); 
     try { 
      scheduler.invokeAll(callables); // blocks until all B finished executing 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     // All B's now finished executing 

    } 
} 

class B implements Callable<Object> { 

    public B() { 

    } 

    @Override 
    public Object call() throws Exception { 
     System.out.println("test"); 
     return null; 
    } 
} 
+0

gustfありがとう、私は今試してみます:) – Caroline

+0

私は質問をしています。 ?私は別のメソッドexecuteTeskAfterAllThread()がある場合、実行中のスレッドがすべて実行されているかどうかを知る方法は? – Caroline

+0

future.get()は未来が実行されるまで待ちます。最後のループのすべての繰り返しは、現在のBが実行を終了するのを待ちます。つまり、ループの後に(追加されたコメント)すべての先物が行われます。 – gustf

関連する問題