同时执行线程并在最后一个线程结束时通知(Android Java)

同时执行线程并在最后一个线程结束时通知(Android Java),java,android,multithreading,thread-safety,Java,Android,Multithreading,Thread Safety,我的计划有: 一项活动 当按下一个按钮时,一项繁重的任务要完成(因为有很多线程,所以需要下载10个)。 因此,当按钮出现时,我会显示一个进度对话框,我会这样做 onClick(){ showDialog(); for (int i=0;i<10;i++) download(i); //download launches a new thread each call //wait without blocking the UI thread until last

我的计划有: 一项活动 当按下一个按钮时,一项繁重的任务要完成(因为有很多线程,所以需要下载10个)。 因此,当按钮出现时,我会显示一个进度对话框,我会这样做

onClick(){
  showDialog();
  for (int i=0;i<10;i++)
       download(i);   //download launches a new thread each call
  //wait without blocking the UI thread until last download end
       continue();
}
onClick(){
showDialog();

对于(int i=0;i您需要引用所有
10
Thread对象。例如作为数组
Thread[]tasks

因此,您需要调用
join()
函数来等待(阻塞)线程结束

for(int i = 0 ; i < 10; i++)
      tasks[i].join();
for(int i=0;i<10;i++)
任务[i].join();
您可以使用或

创建
倒计时闩锁
,并使用正在启动的线程数对其进行初始化,然后将其传递给每个下载线程。当下载线程完成其工作时,它会调用闩锁上的
倒计时

您可以从
onClick
方法中调用闩锁上的
wait
(但这会阻止该线程,听起来好像您不想这样做),或生成一个额外线程,该线程仅调用
wait
,阻止等待所有下载线程。闩锁打开后,您可以执行需要执行的任何操作(例如,关闭进度对话框)

最终倒计时闩锁=新倒计时闩锁(10);

for(int i=0;我希望您能给出快速答案。但若我使用onClick()方法,它将正确阻止UI?我如何避免它?将它置于线程中执行,而不是
onClick()
。(pref.AsyncTask)
final CountDownLatch latch = new CountDownLatch(10);
for (int i=0;i<10;i++)
    download(i, latch);

Thread cleanup = new Thread( new Runnable() {
    public void run() {
        try{
            // This will block
            latch.await();
        } catch (InterruptedException e ) {
            // TODO
            e.printStackTrace();
        }
        takeDownDialog();
        whateverElseYouNeedToDo();
    }
});
cleanup.start();