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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 星辉祝愿 中级黑马   /  2015-5-28 23:03  /  394 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 星辉祝愿 于 2015-5-28 23:22 编辑

线程间通信多个线程在操作同一个资源,但是操作的动作却不一样。
设计思路
1:将资源封装成对象。
2:将线程执行的任务(任务其实就是run方法。)也封装成对象。
3:两个动作必须要同步资源。

等待唤醒机制:涉及的方法:
wait:将同步中的线程处于冻结状态。释放了执行权,释放了资格。同时将线程对象存储到线程池中。
notify唤醒线程池中某一个等待线程。
notifyAll:唤醒的是线程池中的所有线程。
注意:
1:这些方法都需要定义在同步中。
2:因为这些方法必须要标示所属的锁。
    你要知道 A锁上的线程被wait了,那这个线程就相当于处于A锁的线程池中,只能A锁的notify唤醒。
3:这三个方法都定义在Object类中。为什么操作线程的方法定义在Object类中?

    因为这三个方法都需要定义同步内,并标示所属的同步锁,既然被锁调用,而锁又可以是任意对象,那么能被任意对象调用的方法一定定义在Object类中。

  1. /*
  2. 实现进程间的切换,输入一个人信息,就打印一个人信息
  3. */
  4. class Person
  5. {
  6.         private String name;
  7.         private String sex;
  8.         private boolean flag = false;

  9.         //输入
  10.         public synchronized void set(String name,String sex)
  11.         {
  12.                 if(flag)
  13.                         try{this.wait();}catch(Exception e){}//等待notify唤醒
  14.                 this.name = name;
  15.                
  16.                 this.sex = sex;
  17.                 flag = true;
  18.                 this.notify();//唤醒 本方线程
  19.         }
  20.         //输出
  21.         public synchronized void out()
  22.         {
  23.                 if(!flag)
  24.                         try{this.wait();}catch(Exception e){}//等待notify唤醒
  25.                 System.out.println("姓名:"+name+",性别:"+sex);
  26.                 flag = false;
  27.                 this.notify();//唤醒 本方线程
  28.         }
  29. }

  30. class Input implements Runnable
  31. {
  32.         private Person p ;
  33.         Input(Person p)
  34.         {
  35.                 this.p = p;
  36.         }
  37.         public void run()
  38.         {
  39.                 int x = 0;
  40.                 while(true)
  41.                 {
  42.                         if(x==0)                                
  43.                                 p.set("小吴","男");                                
  44.                         else        
  45.                                 p.set("王莉莉","女");                                
  46.                         x = (x+1)%2;
  47.                 }
  48.         }
  49. }
复制代码
运行结果:
姓名:小吴,性别:男
姓名:王莉莉,性别:女
姓名:小吴,性别:男
姓名:王莉莉,性别:女



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马