• 通过消费者和生产者的多线程程序,了解Java的wait()和notify()用法


    仓库类

    public class Store {
    
        private int size = 0;//当前容量
        private final int MAX = 10;//最大容量
        
        //向仓库中增加货物
        public synchronized void add()
        {
            while(size >= MAX)//每次执行都要检查是否已满
            {
                try {
                    wait();//如果满了,进入等待池等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            size++;//放入货物
            
            //输出相关信息
            System.out.println("*************Add***************");
            System.out.println(Thread.currentThread().toString());
            System.out.println("Size: " + Integer.toString(size));
            //唤醒等待池中的消费者线程
            notify();
        }
        
        //从仓库中取货物的方法
        public synchronized void remove()
        {
            while(size == 0)//每次执行前检查仓库中是否有货物
            {
                try {
                    wait();//如果仓库为空,进入等待池
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            size--;//取走货物
            
            //输出相关信息
            System.out.println("*************Remove***************");
            System.out.println(Thread.currentThread().toString());
            System.out.println("Size: " + Integer.toString(size));
            //唤醒等待池中的生产者进程
            notify();
        }
        
        public int getSize()
        {
            return this.size;
        }
    }

    生产者类

    public class Producer extends Thread{
        
        private Store s;
        
        public Producer(Store s) {
            this.s = s;
        }
        
        @Override
        public void run()
        {
            while(true)
            {
                s.add();//增加货物
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    消费者类

    public class Customer extends Thread{
    
        Store s;
        
        public Customer(Store s)
        {
            this.s = s;
        }
        
        @Override
        public void run()
        {
            while(true)
            {
                s.remove();//取走货物
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    Main

    public class Main {
    
        public static void main(String[] args) {
    
            Store s = new Store();
            Producer p1 = new Producer(s);
            Producer p2 = new Producer(s);
            Producer p3 = new Producer(s);
            Customer c1 = new Customer(s);
            Customer c2 = new Customer(s);
            
            p1.setName("Producer1");
            p2.setName("Producer2");
            p3.setName("Producer3");
            c1.setName("Customer1");
            c2.setName("Customer2");
            
            p1.start();
            p2.start();
            p3.start();
            c1.start();
            c2.start();
        }
    
    }

    输出(部分)

    *************Add***************
    Thread[Producer1,5,main]
    Size: 1
    *************Remove***************
    Thread[Customer2,5,main]
    Size: 0
    *************Add***************
    Thread[Producer3,5,main]
    Size: 1
    *************Add***************
    Thread[Producer2,5,main]
    Size: 2
    *************Remove***************
    Thread[Customer1,5,main]
    Size: 1
    *************Add***************
    Thread[Producer2,5,main]
    Size: 2
    *************Remove***************
    Thread[Customer1,5,main]
    Size: 1
    *************Remove***************
    Thread[Customer2,5,main]
    Size: 0
    *************Add***************
    Thread[Producer1,5,main]
    Size: 1
    *************Add***************
    Thread[Producer3,5,main]
    Size: 2
    *************Add***************
    Thread[Producer2,5,main]
    Size: 3
    *************Remove***************
    Thread[Customer2,5,main]
    Size: 2
    *************Add***************
    Thread[Producer3,5,main]
    Size: 3
    *************Add***************
    Thread[Producer1,5,main]
    Size: 4
    *************Remove***************
    Thread[Customer1,5,main]
    Size: 3
    *************Add***************
    Thread[Producer2,5,main]
    Size: 4
    *************Add***************
    Thread[Producer1,5,main]
    Size: 5
    *************Remove***************
    Thread[Customer1,5,main]
    Size: 4
    *************Add***************
    Thread[Producer3,5,main]
    Size: 5
    *************Remove***************
    Thread[Customer2,5,main]
    Size: 4
    *************Add***************
    Thread[Producer2,5,main]
    Size: 5
    *************Remove***************
    Thread[Customer1,5,main]
    Size: 4
    *************Add***************
    Thread[Producer3,5,main]
    Size: 5
    *************Remove***************
    Thread[Customer2,5,main]
    Size: 4
    *************Add***************
    Thread[Producer1,5,main]
    Size: 5

    wait()可以让持有当前对象进入等待状态,等待notify()的唤醒。

  • 相关阅读:
    CentOs上安装Oracle 10g
    多线程更新form
    C#中写INI文件的方法
    C语言的函数大全,参数列表,数字的81016进制转换
    CCS 3.3 操作C函数读写文件
    关于XML文档读写
    关于MathType的一些用法
    DateTime Proc
    拖拽获得文件路径
    用事件进行窗口间参数传递
  • 原文地址:https://www.cnblogs.com/YLsY/p/5783230.html
Copyright © 2020-2023  润新知