我是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方法中的代码。
请帮助我理解这一点。
由于
答案 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方法引用的对象。