在我的Java程序中,我将同时启动两个Threads。我想让我的程序在两个线程的完成之一上加入()而不等待两个线程完成。换句话说,如果线程A在线程B之前完成,我希望主线程加入线程A并恢复主线程而不等待线程B完成,反之亦然。
哪些Java类允许我这样做?
答案 0 :(得分:1)
实现这一目标的一个解决方案是使用CountDownLatch
,让主线程等待其计数达到零,并使两个线程各自减少计数(计数的初始值将为1 in这种情况)。
答案 1 :(得分:0)
public static void main(String[] atrgs){
Thread t1 = new Thread(new MyRunnable());
Thread t2 = new Thread(new MyRunnable());
t1.start();
t2.start();
while(t1.isAlive()&&t2.isAlive()){
}
System.out.println("main resumes");
}
答案 2 :(得分:0)
实际上,Java中的任何类都允许您这样做,因为任何类的对象都可以用作等待通知的监视器。只需创建一个对象,在其上调用wait()
并在完成后让您的线程通知此对象:
private class Foo implements Runnable {
private final int id;
private final Object monitor;
public Foo(int id, Object monitor) {
this.id = id;
this.monitor = monitor;
}
@Override
public void run() {
try {
Thread.sleep((long)(Math.random() * 10000));
} catch (InterruptedException e) {
}
System.out.println(id + " finished");
synchronized (monitor) {
monitor.notify();
}
}
}
public static void main(String[] args) throws InterruptedException {
final Object monitor = new Object();
synchronized (monitor) {
new Thread(new Foo(1, monitor)).start();
new Thread(new Foo(2, monitor)).start();
System.out.println("Main goes to sleep");
monitor.wait();
}
System.out.println("Main is running");
}
第一个通知将取消阻止主线程,它将继续运行。
我想说这是针对您的问题的经典解决方案,尽管@ AR.3建议的解决方案将不那么冗长并且肯定会起作用。我只想表明,即使是一个简单的监视器对象也足以做你想做的事。