public class testwait implements Runnable{ public synchronized void wo() {
this.notify();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("这个是wowowo");
}
public synchronized void ta() throws InterruptedException{
this.wait();
System.out.println("这个是tatata");
}
public static void main(String[] args) throws InterruptedException {
testwait ee=new testwait();
Thread ss=new Thread(ee);
ee.ta();
ss.start();
}
public void run() {
wo();
}}为什么输出结果是
这个是wowowo
这个是tatata程序执行到
public synchronized void wo() {
this.notify();
时,不是唤醒了
public synchronized void ta()
吗?为什么还是
public synchronized void ta()
最后执行?初学JAVA,这里不太懂。希望大家指点下,谢谢。
this.notify();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("这个是wowowo");
}
public synchronized void ta() throws InterruptedException{
this.wait();
System.out.println("这个是tatata");
}
public static void main(String[] args) throws InterruptedException {
testwait ee=new testwait();
Thread ss=new Thread(ee);
ee.ta();
ss.start();
}
public void run() {
wo();
}}为什么输出结果是
这个是wowowo
这个是tatata程序执行到
public synchronized void wo() {
this.notify();
时,不是唤醒了
public synchronized void ta()
吗?为什么还是
public synchronized void ta()
最后执行?初学JAVA,这里不太懂。希望大家指点下,谢谢。
解决方案 »
- java中如何用System.arraycopy去COPY一个自定义类的数组?
- 【100分请教】请问java怎样定时点击某个网页上的某个按钮?
- 就毕业了,找不到工作,我烦我烦,来发下牢骚,散散分,再分享下
- 急求windowbuilder pro,请各位兄弟们帮帮手
- 大家推荐本学Java数据库开发的好书?
- 了解团队开发的,请进。
- 图像二进制文件的读取与图像文件的转换
- java代码如何实现画改变颜色的实体圆?
- 100分问题,超过20人回帖或者解决就揭帖
- 如何令这句输出日期型的数据的只有年月日呢?
- 求助 jdbc-odbc问题
- StringBuilder.appendCodePoint 对应c#中如何使用?
this.notify(); //这里虽然唤醒了ta,但是这个线程本身还在方法里,
//也就是说还在synchronized块,还在占用资源锁,所以其他线程还是没法执行
//必须等此线程结束了synchronized块,释放资源锁,其他线程才有可能执行
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("这个是wowowo");
}
this.notify();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("这个是wowowo");
}
public synchronized void ta() throws InterruptedException{
this.wait();
System.out.println("这个是tatata");
}
public static void main(String[] args) throws InterruptedException {
testwait ee=new testwait();
Thread ss=new Thread(ee);
ss.start();
ee.ta();
}
public void run() {
wo();
}}
public class testwait implements Runnable{ public synchronized void wo() {
this.notify();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("这个是wowowo");
}
public synchronized void ta() throws InterruptedException{
this.wait();
System.out.println("这个是tatata");
}
public static void main(String[] args) throws InterruptedException {
testwait ee=new testwait();
Thread ss=new Thread(ee);
ss.start();
ee.ta();
}
public void run() {
wo();
}}
每个对象都有一个机锁来控制同步访问。Synchronized关键字可以和对象的机锁交互,来实现线程的同步。
由于sleep()方法是Thread类的方法,因此它不能改变对象的机锁。所以当在一个Synchronized方法中调用sleep()时,线程虽然休眠了,但是对象的机锁没有被释放,其他线程仍然无法访问这个对象。而wait()方法则会在线程休眠的同时释放掉机锁,其他线程可以访问该对象。 Wait()方法和notify()方法:当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去了对象的机锁。当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中。该线程从锁池中获得机锁,然后回到wait()前的中断现场。
为什么this.wait()会死住呢?
不理解 谢谢了
这时一个pingpong的例子,
synchonized wait notify 的例子, 感觉是用 wait和 notify的时候是应用在不同的object上比较ok,要不然就sleep join 知道完成。不用wait和notify
不知道有没有帮助
主线程是wait了,但是在
public synchronized void wo()
不是唤醒了吗?
wo虽然notify了,但是wo方法本身还没结束,也就是说synchronized void wo() 还在synchronized的作用范围里,其他线程必须等待synchronized作用范围结束,也就是等待wo方法释放资源锁,才有可能执行。
比如说,张三现在拿着钥匙,他在楼里喊“我把钥匙放回去了,你么可以去取了”,他虽然喊了,但是实际上还没放回去,这时李四听到了,也就是被唤醒了,他想去拿钥匙,但是张三还没放回原位,所以李四还是拿不到,只能等张三真的把钥匙还了,他才能取。
这么解释不知道LZ明不明白?
ee.ta(); //这里主线程会发生wait,后面的代码无法继续执行,这两行代码换个位置就可以
ss.start();
好奇的问一下,LZ是怎么能执行出结果的?