wait() , notify() notifyAll() 生产者,消费者模式

package Day08;

public class Test生产者消费者 {
  public static void main(String[] args) {
    sc a = new sc("生产员1号");           //这里就是调用 有参构造,设置线程的名称
    //new sc("生产员2号").start();          //这里我想多加入几条线程去看看效果
    a.start();
    xf b = new xf("消费者1号");
    b.start();
    //new xf("消费者1号").start();          //这里我想多加入几条线程去看看效果
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
}
class sc extends Thread{
  public sc(String name){            //这里写一个有参的构造方法,是为了在创建线程的时候给线程起名字
    super(name);
}
    static String value = "";
        //我这里是用一个字符串来判断是否为空,(空代表没有产品,生产者需要工作启动线程,不为空 生产者要休息(等待) , 消费者线程执行 购买)
        //如果需要直观一点可以直接定义一个Boolean 类型的变量 static boolean b = false;
@Override
public void run() {
    while(true){
  try {
      synchronized (Test生产者消费者.class) {
        while (!value.equals("")) {
                    // 数据集不为空,那么生产者要休息
      System.out.println(Thread.currentThread().getName() + " -----休息");
        Test生产者消费者.class.wait();
}
          //如果为空 就要去生产(也就是说要启动 生产者线程)
      System.out.println(Thread.currentThread().getName() + "------生产");
          //生产完产品 然后把value 赋值为不为空 之后就是唤醒其他线程(消费者线程),
        value ="_";
        Test生产者消费者.class.notifyAll();

}
} catch (Exception e) {
// TODO: handle exception
}
}

}
}

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class xf extends Thread{
      public xf(String name){ //这里写一个有参的构造方法,是为了在创建线程的时候给线程起名字
        super(name);
}
@Override
public void run() {

      while(true){

    try {
        synchronized (Test生产者消费者.class) {
          while (sc.value.equals("")) {
          System.out.println(Thread.currentThread().getName() + "-----等待");
          Test生产者消费者.class.wait();
}
      System.out.println(Thread.currentThread().getName() + "---- 购买");
        sc.value = "";
    Test生产者消费者.class.notifyAll();
}
} catch (Exception e) {
// TODO: handle exception
}
}

}
}

posted @ 2017-07-08 14:11  一人一世界  阅读(160)  评论(0)    收藏  举报