假设我有这么简单的代码:
for(int i = 0; i < 10; i++) {
thread = new Thread(this);
thread.start();
}
但是,在此代码中,线程显然一次启动10次,并且在前一个完成之前不会等待。在让线程重新开始之前,如何检查线程是否完成?
答案 0 :(得分:32)
在回答您的问题之前,我强烈建议您查看ExecutorServices
,例如ThreadPoolExecutor
。
现在回答你的问题:
如果您想等到上一个帖子完成,在开始下一个帖子之前,请在其间添加thread.join()
:
for(int i = 0; i < 10; i++) {
thread = new Thread(this);
thread.start();
thread.join(); // Wait for it to finish.
}
如果你想开始10个线程,让他们完成他们的工作,然后在循环之后继续你join
:
Thread[] threads = new Thread[10];
for(int i = 0; i < threads.length; i++) {
threads[i] = new Thread(this);
threads[i].start();
}
// Wait for all of the threads to finish.
for (Thread thread : threads)
thread.join();
答案 1 :(得分:11)
如果每个线程必须等到前一个线程在开始之前完成,你最好有一个唯一的线程按顺序执行10次原始run方法:
Runnable r = new Runnable() {
public void run() {
for (int i = 0; i < 10; i++) {
OuterClass.this.run();
}
}
}
new Thread(r).start();
答案 2 :(得分:2)
只是详细说明aioobe的建议:
在回答您的问题之前,我强烈建议您查看ExecutorServices,例如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
newSingleThreadExecutor()
类似于调用newFixedThreadPool(1)
,但确保无法将服务重新配置为使用多个线程。