• java多线程问题


    java多线程问题

    synchronized, wait, notify结合 典型场景生产者消费者问题

    package demo;
    
    
    public class Test5 {
        private static final int MAX_PRODUCT = 5;
        private static final int MIN_PRODUCT = 0;
        private static int product = 0;
    
        public synchronized void produce()
        {
            if(Test5.product >= MAX_PRODUCT)
            {
                try
                {
                    System.out.println("产品已满,请稍候再生产");
                    wait();  
    
                }
                catch(InterruptedException e)
                {
                    e.printStackTrace();
                }
                return;
            }
            Test5.product++;
            System.out.println("生产者生产第" + Test5.product + "个产品.");
            notifyAll();   //通知等待区的消费者可以取出产品了
        }
    
        /**
         * 消费者从店员取产品
         */
        public synchronized void consume()
        {
            if(Test5.product <= MIN_PRODUCT)
            {
                try 
                {
                    System.out.println("缺货,稍候再取");
                    wait(); 
                } 
                catch (InterruptedException e) 
                {
                    e.printStackTrace();
                }
                return;
            }
    
            System.out.println("消费者取走了第" + Test5.product + "个产品.");
            Test5.product--;
            notifyAll();   //通知等待去的生产者可以生产产品了
    
        }
    
    
        public static void main(String[] args) {
            Test5 t = new Test5();
            while(true) {
                new Thread(new Runnable() {
    
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        t.produce();
    
                    }
                }).start();
                new Thread(new Runnable() {
    
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        t.consume();
                    }
                }).start();
            }
    
        }
    }

    运行效果:

  • 相关阅读:
    你看,那个人好像一条狗哎
    我竟然被抓去做了比特币挖矿工
    聊聊JAVA中 String类为什么不可变
    三分钟深入TT猫之故障转移
    shell实现两个数的相加
    shell截取字符串的方法
    Vi命令:如何删除全部内容?
    bash中不可以用字符串做数组下标
    awk打印出当前行的上一行
    awk同时处理多个文件
  • 原文地址:https://www.cnblogs.com/lw-20171224/p/13750240.html
Copyright © 2020-2023  润新知