我正在为多线程实现java Runnable
接口。我有一些n
个线程。每个线程都有自己的生命。我想等到所有线程的生命到期。让我们说以下是案例
for(int i = 0; i< k;i++){
Thread thread1 = new Thread(new xyz())
Thread thread2 = new Thread(new abc())
Thread thread3 = new Thread(new mno())
thread1.start();
thread2.start();
thread3.start();
}
我正在做以下同步。我不知道它是否正确。请让我知道我该怎么办?如果我的线程程序工作正常,有没有办法检查?
if(thread2.isAlive())
try {
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(thread1.isAlive())
try {
thread1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(thread3.isAlive())
try {
thread3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
答案 0 :(得分:8)
您可以将您的Runnables添加到ExecutorService并致电shutdown / awaitTermination,这将在所有任务完成后返回。 javadoc中有一些例子 - 总结一下,你会写出类似的东西:
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.submit(runnable1);
executor.submit(runnable2);
executor.submit(runnable3);
executor.shutdown();
boolean allRunnableAreDone = executor.awaitTermination(60, TimeUnit.SECONDS);
// This line is reached once all runnables have finished their job
// or the 60 second timeout has expired
答案 1 :(得分:4)
虽然来自@assylias的ExecutorService
答案很好,但这里有关于join()
的更多信息。
您不需要在isAlive()
之前测试join()
。 Thread.join()
代码已经这样做了。这是代码中的代码片段:
while (isAlive()) {
wait(0);
}
所以你需要做的就是加入你的主题:
try {
thread2.join();
thread1.join();
thread3.join();
} catch (InterruptedException e) {
// always a good pattern
Thread.currentThread().interrupt();
e.printStackTrace();
}
答案 2 :(得分:2)
作为一个简单的解决方案,您可以将所有线程放在List中,然后在它们启动后调用它们的连接:
List<Thread> threads = new ArrayList<>();
for(int i = 0; i< k;i++)
{
//create threads
Thread thread1 = new Thread(new xyz());
Thread thread2 = new Thread(new abc());
Thread thread3 = new Thread(new mno());
//store threads
threads.add(thread1);
threads.add(thread2);
threads.add(thread3);
//start threads
thread1.start();
thread2.start();
thread3.start();
}
//join all threads
for(Thread t : threads)
t.join();
//You are here after all threads have terminated
答案 3 :(得分:1)
Java包含在java.util.concurrent中执行此类操作的机制。
在您的情况下,您可能需要CountDownLatch或ExecutorService
答案 4 :(得分:1)
join()
方法不会在线程上连接,而是在锁定对象上连接。等待线程必须调用lockObject.join()
,工作线程完成后必须调用lockObject.notify()
。等待线程将被通知并可以继续其工作。这些电话周围还需要synchronize
个阻止。
我还推荐像提到的assylias这样的Executor,它比自己实现这个行为容易得多。