• 生产者消费者 wait()。 notify()


    public class ThreadDemo3 {
        public static void main(String[] args){
            MyList list = new MyList();
            Productor p1 = new Productor(list);
            Productor p2 = new Productor(list);
            Productor p3 = new Productor(list);
    
            Consumer c1 = new Consumer(list);
    //        Consumer c2 = new Consumer(list);
            p1.start();
            p2.start();
            p3.start();
            c1.start();
    //        c2.start();
        }
    }
    
    
    class MyList {
        private int MAX = 100;
        private java.util.List<Integer> list = new java.util.LinkedList<Integer>();
    
        public synchronized void addList(Integer i) {
            while (list.size() >= MAX) {
                try {
                    wait();// 进入锁对象的 等待序列,同时交出锁的控制权。他是对象的方法。//如果被唤醒,那么会接着执行改方法下面的语句。
                    //Thread.sleep(),sleep 是 Thread 的静态方法,只是让线程暂时休眠,不参与cpu的争夺,他与是否具有锁控制权无关,之前有锁控制权,
                    //那么sleep结束之后,醒来了,依旧有锁的控制权,如果之前就没有锁的控制权,那么醒来之后依旧没有锁的控制权。
                }
                catch (Exception e) {
                }
            }
            list.add(i);
            notify();// 由锁对象随机通知(或者说唤醒?)锁等待序列中的一个线程,告诉他,可以获得锁的控制权了,(然后带着锁控制权去争夺cpu)
            //因为是随机通知等待序列中的某一个,所以,前面不能直接往list中添加东西。必须做一定的处理。
            System.out.println("productor.size======>>>>>>>  "+ list.size());
        }
    
        public synchronized int removeList() {
            while (list.size() == 0) {
                try {
                    wait();
                }
                catch (Exception e) {
                }
            }
            int result = list.remove(0);
            notify();
            System.out.println("customer===>>>>>  "+list.size());
            return result;
         
        }
    }
    
    
    
    
    //生产者
    class Productor extends Thread{
        private static int I = 1;
        private MyList list;
        public Productor(MyList list){
            this.list = list;
        }
        public void run(){
            while(true){
                list.addList(I);
                System.out.println(I);
                I ++;
            }
        }
    }
    
    
    //消费者
    class Consumer extends Thread{
        private int i;
        private MyList list;
        public Consumer(MyList list){
            this.list = list;
        }
        public void run(){
            while(true){
                i = list.removeList();
                System.out.println(i);
            }
        }
    }
    
  • 相关阅读:
    数学建模课程常用英语词汇(专业术语)
    MATLAB简易画图
    MATLAB与C语言对比实例:随机数生成
    C语言 投票系统:给定候选人,从键盘输入候选人的名字,统计票数,并输出最终获胜者
    C语言 一个数学问题:求s=(a^m)!+(b^n)!
    C语言 矩阵的转置及矩阵的乘法
    iOS_数据存取(二)
    iOS_数据存取(一)
    iOS_SDWebImage框架分析
    iOS_AFNetWorking框架分析
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/7758136.html
Copyright © 2020-2023  润新知