在Java/Android中,如何等待一个线程完成,然后再启动另一个线程?

在Java/Android中,如何等待一个线程完成,然后再启动另一个线程?,java,android,multithreading,loops,Java,Android,Multithreading,Loops,假设我有一个非常简单的代码: for(int i = 0; i < 10; i++) { thread = new Thread(this); thread.start(); } for(inti=0;i

假设我有一个非常简单的代码:

for(int i = 0; i < 10; i++) { 
    thread = new Thread(this); 
    thread.start(); 
} 
for(inti=0;i<10;i++){
线程=新线程(此);
thread.start();
} 

然而,在这段代码中,线程显然一次启动10次,并且在前一个线程完成之前它不会等待。在让线程重新开始之前,您如何检查线程是否已完成?

在回答您的问题之前,我强烈建议您研究一下,例如

现在回答你的问题:

如果要等待上一个线程完成,请在开始下一个线程之前,在以下两者之间添加
thread.join()

for(int i = 0; i < 10; i++) { 
    thread = new Thread(this); 
    thread.start(); 

    thread.join();    // Wait for it to finish.
}

如果每个线程在启动前必须等待前一个线程完成,则最好让一个唯一的线程按顺序执行原始run方法10次:

Runnable r = new Runnable() {
    public void run() {
        for (int i = 0; i < 10; i++) {
            OuterClass.this.run();
        }
    }
}
new Thread(r).start();
Runnable r=newrunnable(){
公开募捐{
对于(int i=0;i<10;i++){
OuterClass.this.run();
}
}
}
新线程(r.start();

请详细说明aioobe的建议:


在回答您的问题之前,我强烈建议您研究Executor服务,例如ThreadPoolExecutor

有一个特定的
ExecutorService
可用于此任务:

ExecutorService pool = Executors.newSingleThreadExecutor();
for (int i=0; i<10; i++) {
  pool.submit(this); //assuming this is a Runnable
}
pool.shutdown(); //no more tasks can be submitted, running tasks are not interrupted
ExecutorService pool=Executors.newSingleThreadExecutor();

对于(int i=0;i如果在线程完成之前不想执行任何操作,那么为什么要启动线程?只需执行常规方法调用会更容易,直到完成后才会返回。似乎重复:这会使主线程等待启动的线程完成。如果我理解正确,OP希望每个启动的线程等待直到上一个线程完成。另一方面,如果他打算按顺序完成10件事情,为什么他首先要创建10个线程?为什么你要这样做?我可以提供一个我的用例:)如果您需要在android中进行一系列网络连接,并且希望避免NetworkOnMainThreadException,那么您可以这样做。这个答案拯救了我的一天
ExecutorService pool = Executors.newSingleThreadExecutor();
for (int i=0; i<10; i++) {
  pool.submit(this); //assuming this is a Runnable
}
pool.shutdown(); //no more tasks can be submitted, running tasks are not interrupted