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

package com.heima.code;
/*
1.需求:生产者和消费者,生成一个消费一个

本程序符合一个生产者负责生产,一个消费者负责消费。

2.新需求一:要是有多个生成者负责生产,多个消费者负责消费。
在需求代码的基础生进行修改,所遇到的问题情况一:例如---两个生产者,两个消费者
截取的本程序运行的结果,其中会出现错误的情况,例如生产两次商品,消费一次商品的错误情况(要分析为什么会出现这种情况!!!!!)
Thread-2++++++商品......113717
Thread-0++++++商品......113718
Thread-1------商品......113718
Thread-2++++++商品......113719
Thread-0++++++商品......113720
Thread-1------商品......113720
Thread-2++++++商品......113721


3.对新需求一进行修改:把负责生产的代码块中的if(flag)改为while(flag)的情况后,会怎样的一种情况呢?
/*
* 截取的本程序运行的结果,其中会出现程序停止运行的情况。出现这种情况的原因是:两个生产者和两个消费者均处于等待状态(可以进行分析为什么会发生这样的情况?)
Thread-0++++++商品......10
Thread-1------商品......10
Thread-0++++++商品......11
Thread-1------商品......11
Thread-0++++++商品......12
Thread-1------商品......12
Thread-0++++++商品......13
Thread-1------商品......13
Thread-0++++++商品......14
Thread-1------商品......14
Thread-0++++++商品......15
*/



/*// 需求:生产者和消费者,生成一个消费一个.
//本程序符合一个生产者负责生产,一个消费者负责消费。
class ResourceDemo04{
        private String name;
        private int count;
        public boolean flag = false;
        public synchronized void set(String name){
                if(flag)
                        try {
                                this.wait();
                        } catch (Exception e) {}
                this.name = name+"......"+count++;
                System.out.println(Thread.currentThread().getName()+"++++++"+this.name);
                flag = true;
                this.notify();
        }
        public synchronized void out(){
                if(!flag)
                        try {
                                this.wait();
                        } catch (Exception e) {}
                System.out.println(Thread.currentThread().getName()+"------"+this.name);
                flag = false;
                this.notify();
        }
}
class Producer implements Runnable{
        private ResourceDemo04 resd04;
         Producer(ResourceDemo04 resd04){
                this.resd04 = resd04;
        }
        @Override
        public  void run() {
                while(true){
                        resd04.set("商品");
                }
        }
}
class Consumer implements Runnable{
    private ResourceDemo04 resd04;
    Consumer(ResourceDemo04 resd04){
            this.resd04 = resd04;
    }
        @Override
        public void run() {
                while(true){
                        resd04.out();
                }
        }
       
}
public class InputOutputThreadDemo04 {

        public static void main(String[] args) {
      ResourceDemo04 resd04 = new ResourceDemo04();

      Producer pro = new Producer(resd04);
      Consumer con = new Consumer(resd04);

      Thread t1 = new Thread(pro);
      Thread t2 = new Thread(con);

      t1.start();
      t2.start();
        }

}*/


//*************************************************************************************

// 2.新需求一:要是有多个生成者负责生产,多个消费者负责消费。
//在需求代码的基础生进行修改,所遇到的问题情况一:例如---两个生产者,两个消费者
/*
* 截取的本程序运行的结果,其中会出现错误的情况,例如生产两次商品,消费一次商品的错误情况
Thread-2++++++商品......113717
Thread-0++++++商品......113718
Thread-1------商品......113718
Thread-2++++++商品......113719
Thread-0++++++商品......113720
Thread-1------商品......113720
Thread-2++++++商品......113721
* */
/*class ResourceDemo04{
        private String name;
        private int count;
        public boolean flag = false;
        public synchronized void set(String name){
                if(flag)
                        try {
                                this.wait();
                        } catch (Exception e) {}
                this.name = name+"......"+count++;
                System.out.println(Thread.currentThread().getName()+"++++++"+this.name);
                flag = true;
                this.notify();
        }
        public synchronized void out(){
                if(!flag)
                        try {
                                this.wait();
                        } catch (Exception e) {}
                System.out.println(Thread.currentThread().getName()+"------"+this.name);
                flag = false;
                this.notify();
        }
}
class Producer implements Runnable{
        private ResourceDemo04 resd04;
         Producer(ResourceDemo04 resd04){
                this.resd04 = resd04;
        }
        @Override
        public  void run() {
                while(true){
                        resd04.set("商品");
                }
        }
}
class Consumer implements Runnable{
    private ResourceDemo04 resd04;
    Consumer(ResourceDemo04 resd04){
            this.resd04 = resd04;
    }
        @Override
        public void run() {
                while(true){
                        resd04.out();
                }
        }
       
}
public class InputOutputThreadDemo04 {

        public static void main(String[] args) {
      ResourceDemo04 resd04 = new ResourceDemo04();

      Producer pro = new Producer(resd04);
      Consumer con = new Consumer(resd04);

      //新需求一,在需求的基础上进行增加生产者和消费者,以两个生产者和两个消费者为例
      Thread t1 = new Thread(pro);
      Thread t2 = new Thread(con);
      Thread t3 = new Thread(pro);
      Thread t4 = new Thread(con);

      t1.start();
      t2.start();
      t3.start();
      t4.start();

        }
}*/



//*************************************************************************************
//3.对新需求一进行修改:把负责生产的代码块中的if(flag)改为while(flag)的情况后,会怎样的一种情况呢?
/*
* 截取的本程序运行的结果,其中会出现程序停止运行的情况。出现这种情况的原因是:两个生产者和两个消费者均处于等待状态(可以进行分析为什么会发生这样的情况?)
Thread-0++++++商品......10
Thread-1------商品......10
Thread-0++++++商品......11
Thread-1------商品......11
Thread-0++++++商品......12
Thread-1------商品......12
Thread-0++++++商品......13
Thread-1------商品......13
Thread-0++++++商品......14
Thread-1------商品......14
Thread-0++++++商品......15
*/
class ResourceDemo04{
        private String name;
        private int count;
        public boolean flag = false;
        public synchronized void set(String name){
                while(flag)
                        try {
                                this.wait();
                        } catch (Exception e) {}
                this.name = name+"......"+count++;
                System.out.println(Thread.currentThread().getName()+"++++++"+this.name);
                flag = true;
                this.notify();
        }
        public synchronized void out(){
                while(!flag)
                        try {
                                this.wait();
                        } catch (Exception e) {}
                System.out.println(Thread.currentThread().getName()+"------"+this.name);
                flag = false;
                this.notify();
        }
}
class Producer implements Runnable{
        private ResourceDemo04 resd04;
         Producer(ResourceDemo04 resd04){
                this.resd04 = resd04;
        }
        @Override
        public  void run() {
                while(true){
                        resd04.set("商品");
                }
        }
}
class Consumer implements Runnable{
    private ResourceDemo04 resd04;
    Consumer(ResourceDemo04 resd04){
            this.resd04 = resd04;
    }
        @Override
        public void run() {
                while(true){
                        resd04.out();
                }
        }
       
}
public class InputOutputThreadDemo04 {

        public static void main(String[] args) {
      ResourceDemo04 resd04 = new ResourceDemo04();

      Producer pro = new Producer(resd04);
      Consumer con = new Consumer(resd04);

      //新需求一,在需求的基础上进行增加生产者和消费者,以两个生产者和两个消费者为例
      Thread t1 = new Thread(pro);
      Thread t2 = new Thread(con);
      Thread t3 = new Thread(pro);
      Thread t4 = new Thread(con);

      t1.start();
      t2.start();
      t3.start();
      t4.start();

        }
}

0 个回复

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