同时执行线程并在最后一个线程结束时通知(Android Java)
我的计划有: 一项活动 当按下一个按钮时,一项繁重的任务要完成(因为有很多线程,所以需要下载10个)。 因此,当按钮出现时,我会显示一个进度对话框,我会这样做同时执行线程并在最后一个线程结束时通知(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
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();