简单实现生产者消费者模式

*爱你&永不变心* 提交于 2019-11-27 07:34:36
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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!