zoukankan      html  css  js  c++  java
  • 多线程 死锁 wait(int i) notifyAll()

    public class ThreadDemo5 {
        public static void main(String[] args){
            Pool pool = new Pool();
            Productors p1 = new Productors(pool);
            Consumers c1 = new Consumers(pool);
            Consumers c2 = new Consumers(pool);
            p1.start();
            c1.start();
            c2.start();
        }
    }
    
    
    
    class Pool{
        private static int MAX = 1;
        private java.util.List<Integer> list = new java.util.LinkedList<Integer>();
    
        public void addList(int i){
            synchronized(this){ // 如果 这里以 list 为锁,那么后面的wait notify,notifyAll 都要用 list.wait list.notify list.notifyAll
                while (list.size()>=MAX){
                    try{
                        this.wait(3);//等待 3 毫秒,然后开始抢所得控制权//防止死锁的方式 一
                    }
                    catch (Exception e){
    
                    }
                }
                list.add(new Integer(i));
                System.out.println("aft add--->>> "+list.size());
    //            this.notify(); //如果 采用的是notify,且 wait没有指定参数,那么会形成死锁
                this.notifyAll(); //将线程等待序列中的所有等待线程都唤醒,notify 是随机唤醒一个。//防止死锁的方式二
            }
        }
    
        public int remove(){
            synchronized(this){
                while (list.size()<=0){
                    try{
                        wait(3);//这里默认就是用的this.wait
                    }
                    catch(Exception e){
    
                    }
                }
                int n = list.remove(0);
    
                System.out.println("aft remove______--->>> "+list.size());
                notifyAll();
                return n;
            }
        }
    
    }
    
    
    class Productors extends Thread{
        private String name;
        private Pool pool;
        static int i = 1;
    
        public Productors(Pool pool){
            this.pool = pool;
        }
       public void run(){
            while(true){
                pool.addList(i);
    //            System.out.println("p.add--->>> "+);
                i ++;
    
            }
       }
    }
    class Consumers extends Thread{
        private Pool pool;
        private String name;
        public Consumers(Pool pool){
            this.pool = pool;
        }
        public void run(){
            while(true){
                int result = pool.remove();
    //            System.out.println("c.remove --->>> "+result);
            }
        }
    }
    
  • 相关阅读:
    CORS
    ant design vue table 选择当前数据,要如下传
    Web Components
    slot-scope Element-ui 的 slot 关系理解
    Node.js child_process模块中的spawn和exec方法
    node.js关于sendFile的路径问题,以及与send的区别
    uni-app使用uni.onShareAppMessage不生效
    小程序地理定位qqmap-wx-jssdk.js
    L1-009 N个数求和
    L1-008 求整数段和
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/7764412.html
Copyright © 2011-2022 走看看