A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李道福 中级黑马   /  2013-4-3 12:37  /  1421 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李道福 于 2013-4-3 19:02 编辑

在一本资料上看到notify(),notityAll()等这些方法只能在同步代码块和同步方法中使用发,但我发现在run()方法中也可以使用,而run()不是同步方法啊?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

4 个回复

倒序浏览
notify,wait,notifyAll是应用在同步中 带有锁的代码块 你这里说在run()方法中可以用,可能是引用了线程本身的锁
建议您贴一下代码,更具体一点
如果不是在同步中,是不能用这些方法的
回复 使用道具 举报
我手心里的宝 发表于 2013-4-3 12:45
notify,wait,notifyAll是应用在同步中 带有锁的代码块 你这里说在run()方法中可以用,可能是引用了线程本身 ...
  1. class Ticket3 implements Runnable{

  2.         private int num=100;
  3.         public  void show(){
  4.                  if(num>0)
  5.                                 System.out.println(Thread.currentThread().getName()+"--"+"Ticket:"+num--);
  6.         }
  7.         public void run(){
  8.                 while(true){
  9.                         try{
  10.                                 wait(1000);
  11.                                 }catch(Exception e){}
  12.                         show();
  13.                         }
  14.         }
  15. }
  16. public class TestTicket3{

  17.         public static void main(String[] args){
  18.                 Ticket3 tt=new Ticket3();
  19.                 new Thread(tt).start();
  20.                 new Thread(tt).start();
  21.                 new Thread(tt).start();
  22.         }
  23. }
复制代码
麻烦看下,多谢……
回复 使用道具 举报
notify()和notityAll()是Object的方法 它们是针对一个具体对象的,这个对象就是一个锁。
notify()和notityAll()可以唤醒在这个锁上等待的线程
使用notify和notifyAll时必须拥有对象的锁,所以只能在同步代码块和同步方法中使用
文档里的说如下
notify()此方法只应由作为此对象监视器的所有者的线程来调用。通过以下三种方法之一,线程可以成为此对象监视器的所有者:
通过执行此对象的同步实例方法。
通过执行在此对象上进行同步的 synchronized 语句的正文。
对于 Class 类型的对象,可以通过执行该类的同步静态方法。
一次只能有一个线程拥有对象的监视器。
回复 使用道具 举报
李道福 发表于 2013-4-3 13:16
麻烦看下,多谢……

wait()里面加时间的话,就跟sleep() 差不多,这样是可以的
如果里面没有时间就会报Exception in thread "Thread-0" java.lang.IllegalMonitorStateException这个异常
如果不加时间,导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。换句话说,此方法的行为就好像它仅执行 wait(0) 调用一样。
当前的线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马