2011-03-29 14 views
4

因此,我创建可以说5个线程,并且在他们的工作完成后,我想要做另一项工作。那么如何找出执行程序的线程什么时候完成他们的工作,然后才开始超级工作方法?Java等待线程(Threadpool)完成他们的工作并开始另一项工作

主营:

ExecutorService executor = Executors.newFixedThreadPool(5); 
    CountDownLatch doneSignal = new CountDownLatch(5);//thread number 
    for(int i=0;i<5;i++){ 

    getLogFile n = new getLogFile(doneSignal, i);// work method 

    executor.execute(n); 
    doneSignal.await(); 
    } 

//这里大概像executor.awaitTermination(60 TimeUnit.SECONDS); {不起作用}或一些作品

Superworkmethod(uses thread created files);//main thread probably starts thi 

类:

public static class getLogFile implements Runnable { 
private final CountDownLatch doneSignal; 
    private final int i; 
    getLogFile(CountDownLatch doneSignal, int i) { 
     this.doneSignal = doneSignal; 
     this.i = i; 
    } 

    public int run1(String Filenamet) { 
    //do work 
    } 
    public void run() { 
      run1(file); 
      doneSignal.countDown(); 
    } 

}

回答

6

可以使用ExecutorService.invokeAll()

ExecutorService executor = Executors.newFixedThreadPool(5); 

List<Callable<Object>> tasks = new ArrayList<Callable<Object>>();  
for(int i=0;i<5;i++){ 
    tasks.add(Executors.callable(new getLogFile(doneSignal, i))); 
} 

executor.invokeAll(tasks); 
// Here tasks are completed 
+0

作用:tasks.add(Executors.callable(新getLogFile(doneSignal,I));一次执行每个线程或同时执​​行所有线程? ,因为正在使用的j2ssh连接正在执行一项任务/在时间发送一个命令给服务器 – user615927 2011-03-30 10:58:00

+0

@ user615927:'invokeAll()'同时执行任务。如果你想要执行它们,为什么你需要线程池呢? – axtavt 2011-03-30 11:16:33

+0

我想我想让事情变得比它本该更复杂(高水平的东西 - >工作更快),以同样的方式结束),也认为使用它会提高性能(许多小任务在同一时间单独执行 - >速度)...无论如何,也许你知道如何停止主线程,直到其他线程完成他们的工作? – user615927 2011-03-30 13:44:54