2016-11-30 25 views
0

我希望能夠在完成其任務後立即加入每個線程。在下面的代碼示例中,只要每個線程按列表中的順序運行,主線程就會等待,只有下一個線程纔會被加入。Java。按照完成順序加入線程,並在每次加入後運行一種鉤子

List<Thread> threads = new ArrayList<>(); 

    threads.add(new Thread(new Worker(), "T1")); 
    threads.add(new Thread(new Worker(), "T2")); 
    threads.add(new Thread(new Worker(), "T3")); 

    threads.forEach(Thread::start); 

    threads.forEach(thread -> { 
     try { 
      thread.join(); 
      someHook(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    }); 
+0

你的問題是什麼? – GhostCat

+1

使用'CompletionService'。 –

+0

你想要做的是更好地完成可組合期貨。 – Kraylog

回答

2

您應該使用CompletableFuture

ExecutorService e = Executors.newFixedThreadPool(3); 
    ExecutorService single = Executors.newSingleThreadExecutor(); 
    List<CompletableFuture<?>> futures = new ArrayList<>(); 
    futures.add(CompletableFuture.runAsync(new Worker(), e).thenRunAsync(this::someHook, single)); 
    futures.add(CompletableFuture.runAsync(new Worker(), e).thenRunAsync(this::someHook, single)); 
    futures.add(CompletableFuture.runAsync(new Worker(), e).thenRunAsync(this::someHook, single)); 

    futures.forEach(f -> f.get()); // try-catch left out for brevity 

在這種情況下,您將運行3個任務異步,有一個單獨的線程力各鉤被依次完成。

+2

它可能有助於來自Javascript的開發人員注意到completableFuture就像是一個Javascript「promise」實現 – pdem