是否可以在不使用任何内置函数(如isAlive,join)的情况下知道线程何时完成执行。 假设我们有3个并行运行的线程A,B和C.那么如何知道所有线程是否都已完成执行。
答案 0 :(得分:0)
您可以使用CountDownLatch来帮助您解决问题。 我们假设您正在使用ExecutorService创建线程,因此您可以制作类似
的内容 CountDownLatch latch = new CountDownLatch(threadsCount);
ExecutorService executor = Executors.newFixedThreadPool(threadsCount);
for (int x = 0; x < threadsCount; x++)
{
executor.submit(new ClassName(latch));
}
try
{
latch.await();
}
catch (Exception ignored){}
//all threads are done at this point
在你的ClassName中你应该有这样的东西:
class ClassName implements Runnable
{
private CountDownLatch latch;
//constructor:
ClassName(CountDownLatch latch)
{
this.latch = latch;
}
//run method:
@Override
void run()
{
//Your thread code...
latch.countDown();
}
}
因此,在ClassName的run-method中,需要调用latch.countDown()。
CountDownLatch会自动同步,因此您无需考虑这一点。
您不需要使用ExectuorService来使用Latch,这只是一个例子。
答案 1 :(得分:0)
好吧,既然你实际上是在寻求不好的想法,那么这是一个倒退的,不确定的解决方案:
public static void main(String[] args) {
Thread t1 = new Thread(() -> System.out.println("t1"));
t1.start();
WeakReference<Thread> r1 = new WeakReference<Thread>(t1);
t1 = null;
Thread t2 = new Thread(() -> System.out.println("t2"));
t2.start();
WeakReference<Thread> r2 = new WeakReference<Thread>(t2);
t2 = null;
while (r1.get() != null || r2.get() != null) {
System.gc();
}
System.out.println("done!");
}