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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Tauruszzy 中级黑马   /  2015-5-14 11:50  /  260 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

线程间通信:多个线程操作同一个资源,但是操作的动作不一样。
知识点:
wait
notify
notifyAll
都使用在同步中,因为要对持有监视器(锁)的线程操作。因为只有同步才具有锁,所以要使用在同步中。

为什么这些操作线程的方法要定义在Object类中呢?
因为这些方法在操作同步中线程时都要标记他们所操作的线程持有的锁。
只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒。notify不可以唤醒不同锁中的线程。
也就是等待和唤醒必须是同一把锁。而锁可以是任意对象,任意对象都可以定义在Object类中,所以
这些方法要定义在Object类中。

2 个回复

倒序浏览
示例代码:
  1. /*
  2. 线程之间通信:
  3. 多个线程操作同一个资源,但是操作的动作不同。
  4. */
  5. class Res
  6. {
  7.         String name;
  8.         String sex;
  9.         boolean flag=false;
  10. }

  11. class Input implements Runnable
  12. {
  13.         private Res r;
  14.         Input(Res r)
  15.         {
  16.                 this.r=r;
  17.         }
  18.         public void run()
  19.         {
  20.                 int x=0;
  21.                 while(true)
  22.                 {
  23.                         synchronized(r)
  24.                         {
  25.                                 if(r.flag)
  26.                                         try{r.wait();}catch(Exception e){}
  27.                                 if(x==0)
  28.                             {
  29.                                         r.name="mike";
  30.                                         r.sex="man";
  31.                                 }
  32.                                 else
  33.                                 {
  34.                                         r.name="丽丽";
  35.                                         r.sex="女女女";
  36.                                 }
  37.                                 x=(x+1)%2;
  38.                                 r.flag=true;
  39.                                 r.notify();
  40.                         }
  41.                        
  42.                 }
  43.                
  44.         }
  45. }

  46. class Output implements Runnable
  47. {
  48.         Res r;
  49.         Output(Res r)
  50.         {
  51.                 this.r=r;
  52.         }
  53.         public void run()
  54.         {
  55.                 while(true)
  56.                 {
  57.                         synchronized(r)
  58.                         {
  59.                                 if(!r.flag)
  60.                                         try{r.wait();}catch(Exception e){}
  61.                                 System.out.println(r.name+"....."+r.sex);
  62.                                 r.flag=false;
  63.                                 r.notify();
  64.                         }
  65.                 }
  66.         }
  67. }
  68. class  InputOutputDemo
  69. {
  70.         public static void main(String[] args)
  71.         {
  72.                 Res r=new Res();
  73.                 Input in=new Input(r);
  74.                 Output out=new Output(r);

  75.                 Thread t1=new Thread(in);
  76.                 Thread t2=new Thread(out);
  77.                
  78.                 t1.start();
  79.                 t2.start();

  80.         }
  81. }
复制代码
回复 使用道具 举报

上面代码的优化
  1. /*
  2. 线程之间通信:
  3. 多个线程操作同一个资源,但是操作的动作不同。
  4. */
  5. class Res
  6. {
  7.         private String name;
  8.         private String sex;
  9.         private boolean flag=false;
  10.         public synchronized void set(String name,String sex)
  11.         {
  12.                 if(flag)
  13.                         try{this.wait();}catch(Exception e){}

  14.                 this.name=name;
  15.                 this.sex=sex;

  16.                 flag=true;
  17.                 this.notify();
  18.         }
  19.         public synchronized void out()
  20.         {
  21.                 if(!flag)
  22.                         try{this.wait();}catch(Exception e){}

  23.                 System.out.println(name+"      "+sex);

  24.                 flag=false;
  25.                 notify();
  26.         }
  27. }

  28. class Input implements Runnable
  29. {
  30.         private Res r;
  31.         Input(Res r)
  32.         {
  33.                 this.r=r;
  34.         }
  35.         public void run()
  36.         {
  37.                 int x=0;
  38.                 while(true)
  39.                 {
  40.                                 if(x==0)
  41.                                         r.set("mike","man");
  42.                                 else
  43.                                         r.set("丽丽","女女女");
  44.                                 x=(x+1)%2;
  45.                 }
  46.                
  47.         }
  48. }

  49. class Output implements Runnable
  50. {
  51.         Res r;
  52.         Output(Res r)
  53.         {
  54.                 this.r=r;
  55.         }
  56.         public void run()
  57.         {
  58.                 while(true)
  59.                 {
  60.                         synchronized(r)
  61.                         {
  62.                                 r.out();
  63.                         }
  64.                 }
  65.         }
  66. }
  67. class  InputOutputDemo
  68. {
  69.         public static void main(String[] args)
  70.         {
  71.                 Res r=new Res();
  72.                 new Thread(new Input(r)).start();
  73.                 new Thread(new Output(r)).start();
  74.                 /*Input in=new Input(r);
  75.                 Output out=new Output(r);

  76.                 Thread t1=new Thread(in);
  77.                 Thread t2=new Thread(out);
  78.                
  79.                 t1.start();
  80.                 t2.start();
  81.                 */

  82.         }
  83. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马