【问题标题】:Java thread join method calls wait on which object?Java线程连接方法调用等待哪个对象?
【发布时间】:2018-06-04 11:29:22
【问题描述】:

我是 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() 它可以工作。

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

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

请帮助我理解这一点。

谢谢

【问题讨论】:

  • ?加入和等待是两个不同的东西,用于两个非常不同的目的。例如,您可以在任何类型的对象上调用wait(),而几乎从不在线程对象上调用它,而join() 在线程上调用。最好的办法是阅读或重新阅读有关该主题的章节,因为它涉及的内容相当丰富,并且比我们发布的任何内容都可以让您对该主题有更深入的了解。
  • 你在哪里检查连接是如何实现的? Java 源代码?
  • 是的。来自Java源代码
  • 它只是使用等待来暂停线程的加入,如果需要延迟。这里的等待是在 本身 上的 Thread 对象上调用的。它本身持有监视器,因为该方法使用this 作为监视器进行同步(默认使用同步)。
  • 你注意到join 方法签名中的synchronized 修饰符起作用了吗? public final synchronized void join(long millis)。这就是 waitjoin 方法中工作的原因。

标签: java multithreading


【解决方案1】:

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

  • t.join()

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

  • o.wait()

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

【讨论】:

    【解决方案2】:

    从技术上讲,在连接代码中,我们有:

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

    在这种情况下,这与调用 this.wait() 相同。所以回答这个问题,被调用的等待函数是rtwait方法引用的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-26
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      相关资源
      最近更新 更多