zoukankan      html  css  js  c++  java
  • 简单实现生产者消费者模式

    package com.ring2.test;
    
    /**
     * 定义一把枪中只能装满20颗子弹
     * 当子弹数大于20颗时,生产者停止生产子弹,等待被唤醒
     * 当子弹等于0颗时,消费者停止射击子弹,等待被唤醒
     *
     */
    public class Gun {
        private static int bullet = 0;
        private static int maxBullet = 20;
        private static String Lock = "the same object";
        static class Provider implements Runnable{
            @Override
            public void run() {
                for (int i = 0; i < 20; i++ ){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (Lock){
                        if (bullet == maxBullet){
                            try {
                                Lock.wait();
                                System.out.println("枪膛已满,停止装弹,等待通知。");
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        bullet++;
                        System.out.println(Thread.currentThread().getName()+"完成一次装弹,当前子弹数量为:"+bullet);
                        Lock.notifyAll();
                    }
                }
            }
        }
    
        static class Consumer implements Runnable {
            @Override
            public void run() {
                for (int i = 0; i < 20; i++) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (Lock) {
                        if (bullet == 0) {
                            try {
                                Lock.wait();
                                System.out.println("子弹数量为空,等待装子弹。");
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        bullet--;
                        System.out.println(Thread.currentThread().getName() + "完成一次射击,当前子弹数量为:" + bullet);
                        Lock.notifyAll();
                    }
    
                }
            }
        }
        public static void main(String[] args) {
            System.out.println("启动线程");
            new Thread(new Provider()).start();
            new Thread(new Consumer()).start();
        }
        }

    执行结果:

    启动线程
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    子弹数量为空,等待装子弹。
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    子弹数量为空,等待装子弹。
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    子弹数量为空,等待装子弹。
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    子弹数量为空,等待装子弹。
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    Thread-0完成一次装弹,当前子弹数量为:1
    Thread-1完成一次射击,当前子弹数量为:0
    View Code
  • 相关阅读:
    单例模式
    spring boot 调度任务
    linux yum安装MySQL5.6
    day5模块学习--sys模块
    day5模块学习 -- os模块学习
    day5模块学习--random模块
    day5模块学习 -- time、datetime时间模块
    生成随机验证码的方法
    SQL中format()函数对应的格式
    day4作业小代码练习
  • 原文地址:https://www.cnblogs.com/ring2/p/11351263.html
Copyright © 2011-2022 走看看