【问题标题】:Android ThreadPoolExecutor and join()Android ThreadPoolExecutor 和 join()
【发布时间】:2012-07-07 15:29:46
【问题描述】:

我有一个线程池执行程序,其中包含多个同时运行的线程。我想在所有线程完成后执行一些代码。我怎样才能做到这一点?

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

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

        });

       //after all threads finish
       doOtherStuff();

【问题讨论】:

    标签: java android multithreading threadpoolexecutor


    【解决方案1】:

    这应该可以满足您的需要:

    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();
    

    【讨论】:

    • 出于兴趣,您选择 DAYS 有什么原因吗?我会走几毫秒。
    • @JJG:我想让等待尽可能接近“无限期等待”,所以我选择了两个参数的最大值。这只是为了确保您的任务在障碍超时之前无法返回。
    【解决方案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。

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

    【讨论】:

    • 如果你打算使用这种方法,你应该扩展 ThreadPoolExecutor 并将latch.countDown() 调用放在重写的afterExecute 方法中。我不会将它放在每个可运行文件中,因为一开始这将是侵入性的,并且您必须确保它也位于 finally 块中。但是,我建议有人使用 shutdown() 和 awaitTermination() 提出的方法。
    【解决方案3】:

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

    CountDownLatch latch = new CountDownLatch(3);
    

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

    latch.countDown();
    

    上面的这行代码每次执行都会将latch减1。

    latch.await();
    

    一旦闩锁的倒计时达到0,上面的这行代码将让其下面的代码执行。之后你可以放置你需要做的工作......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 2014-01-17
      • 2017-06-20
      相关资源
      最近更新 更多