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);
            }
        }
    }
    
  • 相关阅读:
    第八章 多线程编程
    Linked List Cycle II
    Swap Nodes in Pairs
    Container With Most Water
    Best Time to Buy and Sell Stock III
    Best Time to Buy and Sell Stock II
    Linked List Cycle
    4Sum
    3Sum
    Integer to Roman
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/7764412.html
Copyright © 2011-2022 走看看