加入Java中的任何一个线程

时间:2016-09-21 21:28:36

标签: java multithreading

在我的Java程序中,我将同时启动两个Threads。我想让我的程序在两个线程的完成之一上加入()而不等待两个线程完成。换句话说,如果线程A在线程B之前完成,我希望主线程加入线程A并恢复主线程而不等待线程B完成,反之亦然。

哪些Java类允许我这样做?

3 个答案:

答案 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建议的解决方案将不那么冗长并且肯定会起作用。我只想表明,即使是一个简单的监视器对象也足以做你想做的事。