• 多线程 死锁 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);
            }
        }
    }
    
  • 相关阅读:
    设计克制
    高性能动画的
    点选日历控件
    adobe工具软件应用
    Visual Studio 2022 性能增强:更快的 C++、优化 Git 分支切换
    省市县的字典表
    Hype 4.0(Mac系统)的布局功能
    RN相关的文章超过100篇高质量文章
    前端格局
    移动端关于平方字体的适配
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/7764412.html
Copyright © 2020-2023  润新知