【发布时间】: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)。这就是wait在join方法中工作的原因。
标签: java multithreading