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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package thread;

public class ProducerConsumer {
        public static void main(String args[]){
                SyncStack ss = new SyncStack();//
                Producer p = new Producer(ss) ; //new生产者对象
                Consumer c = new Consumer(ss) ;//new消费者对象
                new Thread (p).start();
                new Thread (p).start();
                new Thread (p).start();
                new Thread (c).start();
        }

}
class WoTou {//建立对象WoTou
        int id ;
        WoTou(int id){
                this.id = id;
        }
        public String toString(){
                return "WoTou: " +id;//返回 WoTou的id ;
        }
}

class SyncStack{
        int index = 0 ;
        WoTou arrWT[] = new WoTou[6];//定义数组arrWT[]的类型为 WoTou ;长度为 6 ;
       
        public synchronized void push(WoTou wt){
                while(index == arrWT.length){//判定语句 index = arrWT.length ; 即篮子装满了窝头;
                        try{
                                this.wait();//线程进入等待状态
                        }catch(InterruptedException e){
                                e.printStackTrace();
                        }
                }
                this.notifyAll();//当篮子的窝头被消耗掉后唤醒所有锁定的等待的线程 ,
                arrWT[index] = wt;//继续往数组填充窝头 ,即篮子
                index++;
                }
        public synchronized WoTou pop(){
                while(index == 0) {
                        try {
                                this.wait();//满足while条件则 线程进入 等待执行状态,直到被唤醒;
                        }catch(InterruptedException e){
                                e.printStackTrace();
                        }
                }
                this.notifyAll();//唤醒等待的线程
                index--;
                return         arrWT[index] ;//返回窝头 及 index 的值;
        }
       
}

class Producer implements Runnable{//生产者接口实现
        SyncStack ss = null ;//定义篮子初始值为空
        Producer(SyncStack ss){
                this.ss = ss ;
        }
        public void run(){
                for(int i = 0 ; i < 20;i++){//进行20次循环
                        WoTou wt = new WoTou(i);//定义生产 20 个窝头
                        ss.push(wt);//调用push(WoTou wt)方法
                        System.out.println("生产了:"+wt);//输出生产的馒头数量
                        try {
                                Thread.sleep((int)(Math.random()*200));//每生产一个窝头 休眠 (0.0  , 1.0 )*200  中的随机一个时间 ,给其他线程运行的时间;
                        }catch(InterruptedException e){//捕获异常;
                                e.printStackTrace();
                        }
                }
        }
}

class Consumer implements Runnable{//消费者接口实现
        SyncStack ss = null ;
        Consumer(SyncStack ss){
                this.ss = ss;
        }
        public  void run(){
                for (int i = 0 ;i< 20 ; i++){
                        WoTou wt = ss.pop();//调用 WoTou pop()方法
                        System.out.println("消费了:"+ wt);//输出消耗的馒头数量
                        try {
                                Thread.sleep((int)(Math.random()*200));//每生产一个窝头 休眠 (0.0  , 1.0 )*200  中的随机一个时间 ,给其他线程运行的时间;
                        }catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
               
        }
}
这个  sychpackage thread;

public class ProducerConsumer {
        public static void main(String args[]){
                SyncStack ss = new SyncStack();//
                Producer p = new Producer(ss) ; //new生产者对象
                Consumer c = new Consumer(ss) ;//new消费者对象
                new Thread (p).start();
                new Thread (p).start();
                new Thread (p).start();
                new Thread (c).start();
        }

}
class WoTou {//建立对象WoTou
        int id ;
        WoTou(int id){
                this.id = id;
        }
        public String toString(){
                return "WoTou: " +id;//返回 WoTou的id ;
        }
}

class SyncStack{
        int index = 0 ;
        WoTou arrWT[] = new WoTou[6];//定义数组arrWT[]的类型为 WoTou ;长度为 6 ;
       
        public synchronized void push(WoTou wt){
                while(index == arrWT.length){//判定语句 index = arrWT.length ; 即篮子装满了窝头;
                        try{
                                this.wait();//线程进入等待状态
                        }catch(InterruptedException e){
                                e.printStackTrace();
                        }
                }
                this.notifyAll();//当篮子的窝头被消耗掉后唤醒所有锁定的等待的线程 ,
                arrWT[index] = wt;//继续往数组填充窝头 ,即篮子
                index++;
                }
        public synchronized WoTou pop(){
                while(index == 0) {
                        try {
                                this.wait();//满足while条件则 线程进入 等待执行状态,直到被唤醒;
                        }catch(InterruptedException e){
                                e.printStackTrace();
                        }
                }
                this.notifyAll();//唤醒等待的线程
                index--;
                return         arrWT[index] ;//返回窝头 及 index 的值;
        }
       
}

class Producer implements Runnable{//生产者接口实现
        SyncStack ss = null ;//定义篮子初始值为空
        Producer(SyncStack ss){
                this.ss = ss ;
        }
        public void run(){
                for(int i = 0 ; i < 20;i++){//进行20次循环
                        WoTou wt = new WoTou(i);//定义生产 20 个窝头
                        ss.push(wt);//调用push(WoTou wt)方法
                        System.out.println("生产了:"+wt);//输出生产的窝头数量
                        try {
                                Thread.sleep((int)(Math.random()*200));//每生产一个窝头 休眠 (0.0  , 1.0 )*200  中的随机一个时间 ,给其他线程运行的时间;
                        }catch(InterruptedException e){//捕获异常;
                                e.printStackTrace();
                        }
                }
        }
}

class Consumer implements Runnable{//消费者接口实现
        SyncStack ss = null ;
        Consumer(SyncStack ss){
                this.ss = ss;
        }
        public  void run(){
                for (int i = 0 ;i< 20 ; i++){
                        WoTou wt = ss.pop();//调用 WoTou pop()方法
                        System.out.println("消费了:"+ wt);//输出消耗的馒头数量
                        try {
                                Thread.sleep((int)(Math.random()*200));//每生产一个窝头 休眠 (0.0  , 1.0 )*200  中的随机一个时间 ,给其他线程运行的时间;
                        }catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
               
        }
}
这个 synchronized 不是锁定只允许一个线程访问 里面的内容吗? 但是this.notifyAll 是唤醒 所有的线程 ,这中间是不是有什么矛盾 呢?还有 ,麻烦 各位哥哥姐姐 看看我的注释是否有错误,有的话麻烦帮修改一下,谢谢!!!

0 个回复

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