java - 关于多线程notify的问题
本文介绍了java - 关于多线程notify的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
public class WaitTest {
static class ThreadA extends Thread {
public ThreadA(String name){
super(name);
}
@Override
public void run() {
synchronized (this){
System.out.println(Thread.currentThread().getName()+" call notify()");
//notify();//notify之后 要等到这个代码块结束之后才会把锁让出去,当然如果在notify之后又有wait,那就会主动把锁让出去
try {
System.out.println(Thread.currentThread().getName()+" wait");
//wait();
//Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" after notify");
}
}
}
public static void main(String[] args) throws InterruptedException {
ThreadA t1 =new ThreadA("t1");
synchronized (t1){
System.out.println(Thread.currentThread().getName()+" start t1");
t1.start();
System.out.println(Thread.currentThread().getName()+" wait");
t1.wait();//
//System.out.println(Thread.currentThread().getName()+" notify");
// t1.notify();
System.out.println(t1.getName());
System.out.println(Thread.currentThread().getName()+" continue");
//t1.notify();
}
}
}
照理来说 t1.wait() 应该会阻塞主线程,并没有其他地方notify
而去掉t1.start()之后,就能阻塞住了
这是什么道理?编译器优化?还是synchronized代码块内如果不对monitor进行操作,结束主动notify??
解决方案
并不是优化其实,跟线程的执行有关的。在java doc中,public final synchronized void join(long millis)
这个方法的注释上面写着一句话
<p> This implementation uses a loop of {@code this.wait} calls conditioned on {@code this.isAlive}. As a thread terminates the {@code this.notifyAll} method is invoked. It is recommended that applications not use {@code wait}, {@code notify}, or {@code notifyAll} on {@code Thread} instances.
看到加黑体,其实是线程结束之后调用的notifyAll导致wait苏醒的。并不是什么虚拟机优化导致的。希望能解答你的困惑
这篇关于java - 关于多线程notify的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文