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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王艳静 中级黑马   /  2015-8-18 16:39  /  301 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

wait(),notify(),notifyAll() 这些方法存在与同步中。使用这些方法时必须要标识所属的同步的锁。同一个锁上wait的线程,只可以被同一个锁上的notify唤醒。

那么当一个线程被wait()后,另一个线程就可获取执行资格。那么就是说现在两个线程在形式上都存在于synchronized(p){}的括号范围内,但是它们不可能同时获得锁。所以说,与其说wait(),notify(),notifyAll() 这些方法控制的是线程,不如说它们控制的是锁。

  1. /**
  2. * 线程间通信示例
  3. * 思路:
  4. * 1、创建资源类
  5. * 2、创建对资源不同的操作类
  6. * 3、创建两个线程分别控制两个操作
  7. * @author 王艳静
  8. *
  9. */
  10. //定义资源类
  11. class Person{
  12.         String name;
  13.         String sex;
  14.         boolean flag = false;
  15. }
  16. //定义对资源的设置类
  17. class SetPerson implements Runnable{
  18.         Person p;
  19.         int i = 0;
  20.         SetPerson(Person p){
  21.                 this.p = p;
  22.         }
  23.         @Override
  24.         public  void run() {
  25.                 while(true){
  26.                        
  27.                         synchronized(p){
  28.                                 if(p.flag)
  29.                                         try {p.wait();} catch (InterruptedException e) {}
  30.                                 if(i==0){
  31.                                         p.name = "小妖";
  32.                                         p.sex = "女";
  33.                                        
  34.                                 }
  35.                                 else{
  36.                                         p.name = "Pixy";
  37.                                         p.sex = "girl";
  38.                                 }
  39.                                 i = (i+1)%2;
  40.                                 p.flag=true;
  41.                                 p.notify();
  42.                         }

  43.                 }               
  44.         }
  45. }
  46. //定义对资源的输出类
  47. class GetPerson implements Runnable{
  48.         Person p;
  49.         GetPerson(Person p){
  50.                 this.p = p;
  51.         }
  52.         @Override
  53.         public void run() {
  54.                 while(true)                       
  55.                         synchronized (p) {
  56.                                 if(!p.flag)
  57.                                         try {p.wait();} catch (InterruptedException e) {}
  58.                                 System.out.println(p.name+"----"+p.sex);
  59.                                 p.flag = false;
  60.                                 p.notify();
  61.                         }                       
  62.         }       
  63. }
  64. //测试类
  65. public class InputOutputDemo {
  66.         public static void main(String[] args) {
  67.                 //创建资源
  68.                 Person p = new Person();
  69.                 //创建线程,传入资源并启动
  70.                 new Thread(new SetPerson(p)).start();
  71.                 new Thread(new GetPerson(p)).start();

  72.         }
  73. }
复制代码




0 个回复

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