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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王璐 中级黑马   /  2012-6-15 15:53  /  1982 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王璐 于 2012-6-16 11:17 编辑
  1. class Res
  2. {
  3.         String name;
  4.         String sex;
  5.         boolean flag = false;
  6. }

  7. class Input implements Runnable
  8. {
  9.         private Res r ;
  10.         Input(Res r)
  11.         {
  12.                 this.r = r;
  13.         }
  14.         public void run()
  15.         {
  16.                 int x = 0;
  17.                 while(true)
  18.                 {
  19.                         synchronized(r)
  20.                         {

  21.                                 if(r.flag)
  22.                                         try{r.wait();}catch(Exception e){}
  23.                                 if(x==0)
  24.                                 {
  25.                                         r.name="mike";
  26.                                         r.sex="man";
  27.                                 }
  28.                                 else
  29.                                 {
  30.                                         r.name="丽丽";
  31.                                         r.sex = "女女女女女";
  32.                                 }
  33.                                 x = (x+1)%2;
  34.                                 r.flag = true;
  35.                                 r.notify();
  36.                         }
  37.                 }
  38.         }
  39. }

  40. class Output implements Runnable
  41. {
  42.         private Res r ;
  43.         
  44.         Output(Res r)
  45.         {
  46.                 this.r = r;
  47.         }
  48.         public void run()
  49.         {
  50.                 while(true)
  51.                 {
  52.                         synchronized(r)
  53.                         {
  54.                                 if(!r.flag)
  55.                                         try{r.wait();}catch(Exception e){}
  56.                                 System.out.println(r.name+"...."+r.sex);
  57.                                 r.flag = false;
  58.                                 r.notify();
  59.                         }
  60.                 }
  61.         }
  62. }
复制代码
notify()是怎么唤醒其它进程的,为什么没有标识,怎么区分它唤醒的是哪个进程?

4 个回复

倒序浏览
notify()方法,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。 直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争,因为这个方法不属于Thread 类,而是属于最底层的object基础类的,也就是说不只是Thread,每个对象都有notify的功能,因为它是用来操纵锁的, 而每个对象都有锁,锁是每个对象的基础,既然锁是基础的,那么操纵锁的方法也是最基础的,由JVM根据当前线程池当中的可运行状态的线程的优先级来决定
回复 使用道具 举报
这个程序是开启了两个线程,第一个顺序运行着,第二个线程根据要wait(),当第一个线程notify()后,相当于给对方发起通知,如果有多个线程,启动哪个等待的就不确定了,这里只有一个等待的,所以第二线程就唤醒了,再打印第一个线程给r对象赋的值

总的来说就是第二线程每次等待第一个线程赋完值再唤起它来打印
回复 使用道具 举报
notify()是按顺序来唤醒被等待的线程的,第一个等待的线程也将是第一个被唤醒,再接着唤醒第二个等待的线程,依次这样子下去。
回复 使用道具 举报
notify()方法:notify
public final void notify()唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。
直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。

此方法只应由作为此对象监视器的所有者的线程来调用。通过以下三种方法之一,线程可以成为此对象监视器的所有者:

通过执行此对象的同步实例方法。
通过执行在此对象上进行同步的 synchronized 语句的正文。
对于 Class 类型的对象,可以通过执行该类的同步静态方法。
一次只能有一个线程拥有对象的监视器。


这是API文档中的,你以后可以自己查查。
其实用notify(),只要线程一多,容易死锁,所有多考虑下nitifyAll()方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马