2

我有一个线程池执行器,它有几个同时运行的线程。我想在所有线程完成后执行一些代码。我怎样才能做到这一点?

      for(String x : mList){
        mExecutor.execute(new Runnable(){

            @Override
            public void run() {
                //Do Stuff
                            }

        });

       //after all threads finish
       doOtherStuff();
4

3 回答 3

2

你必须使用一个CountDownLatch. CountDownLatch用执行器的线程数初始化。在末尾Runnable添加CountDownLatch.countDown();

 CountDownLatch countDownL = new CountDownLatch(N);
for(String x : mList){
        mExecutor.execute(new Runnable(){

            @Override
            public void run() {
                //Do Stuff
                countDownL.countDown();
            }

        });
  }

   countDownL.await();
       //after all threads finish
       doOtherStuff();

请注意,调用await()会导致调用者的阻塞,直到countDonwL达到 0 的值。当然,如果您在 UI 线程上调用 await(),它会阻塞 UI。

编辑我在检查语法之前把它写下来。所以可能会出现一些拼写错误。

于 2012-07-07T15:45:53.083 回答
2

这应该可以实现您所需要的:

for(String x : mList) {
   mExecutor.execute(new Runnable() {    
        @Override
        public void run() {
            //Do Stuff
        }    
   });
 }

 mExecutor.shutdown();
 mExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

 //after all threads finish
 doOtherStuff();
于 2012-07-07T15:53:31.100 回答
0

使用java.util.concurrency 包中提供的 CountDownLatch将帮助您实现您所需要的。

CountDownLatch latch = new CountDownLatch(3);

上面这行将创建一个计数为 3 的 CountDownlatch。

latch.countDown();

上面的这行代码每次执行时都会将锁存器减 1。

latch.await();

一旦闩锁的倒计时达到0,上面的这行代码就会执行它下面的代码。在此之后,您可以放置​​您需要做的工作......

于 2012-07-07T16:21:42.643 回答