Java线程连接方法调用等待哪个对象?

时间:2018-06-04 01:49:38

标签: java multithreading

我是Java多线程的新手,并且很少与Java加入和等待的工作方式混淆。

我有以下示例

public class Main {

    private static int counter;

    static class RunnableThread implements Runnable {
        private static final String PREFIX = "RT-";
        public RunnableThread() {
        }

        @Override
        public void run() {

            counter++;
            System.out.println(PREFIX+counter);
            try {
                Thread.sleep(50000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Thread rt = new Thread(new RunnableThread());
        //Thread tt = new TradThread();

        rt.start();
        //tt.start();
        try {
            rt.wait();
        } catch (InterruptedException e1) {
            System.out.println("Main thread wait is interrupted");
            e1.printStackTrace();
        }

        System.out.println("MT-"+counter);
    }

}

它抛出IllegalMonitorStateException,因为主线程没有任何监视器。现在使用相同的代码,如果我将rt.wait()更改为rt.join(),它就可以工作。

当我看到如何实现连接时,看起来它调用了wait()方法。现在,从连接内部等待的调用如何有效?

我会假设主线程调用rt.join()时,主线程本身正在执行join方法中的代码。

请帮助我理解这一点。

由于

2 个答案:

答案 0 :(得分:0)

Thread.join()和Object.wait()非常不同。

  • t.join()

    加入当前线程,你在线程t后面。因此,当线程t完成其工作之前,当前线程将不会运行。

  • o.wait()

    释放对象o的锁定并暂停当前线程。因此,当前线程不会运行,直到它通过o.notify()或o.notifyAll()从其他线程再次获得对象o的锁定。  注意:在调用此方法之前,您必须已获得对象o的锁定。

答案 1 :(得分:-1)

从技术上讲,在加入代码中,我们有:

wait(0);
...
wait(delay);

在这种情况下,这与调用this.wait()相同。因此,要回答这个问题,调用的wait函数是rt wait方法引用的对象。