美文网首页IT@程序员猿媛程序员
Java多线程---枪有20发子弹,实现子弹不停上膛射出的过程,

Java多线程---枪有20发子弹,实现子弹不停上膛射出的过程,

作者: nosixtools | 来源:发表于2019-04-05 17:53 被阅读3次

场景:一支枪可盛20发子弹,运用多线程,实现子弹不停上膛、射出的过程。
一、基于信号量实现
二、基于ReentrantLock实现

private static Semaphore notFull = new Semaphore(20);
    private static Semaphore notEmpty = new Semaphore(0);

    public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(6);
        pool.execute(new Gun(notEmpty, notFull));
        pool.execute(new Bullet(notEmpty, notFull));
    }

    public static class Gun implements Runnable {

        private Semaphore notEmpty;
        private Semaphore notFull;

        public Gun(Semaphore notEmpty, Semaphore notFull) {
            this.notEmpty = notEmpty;
            this.notFull = notFull;
        }

        public void run() {

            while (true) {
                try {
                    notEmpty.acquire();
                    System.out.println("射击---biubiubiu");
                    notFull.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    public static class Bullet implements Runnable {

        private Semaphore notEmpty;
        private Semaphore notFull;

        public Bullet(Semaphore notEmpty, Semaphore notFull) {
            this.notEmpty = notEmpty;
            this.notFull = notFull;
        }

        public void run() {
            while (true) {
                try {
                    notFull.acquire();
                    System.out.println("压入子弹---铛铛");
                    notEmpty.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

基于ReentrantLock实现

    private static Lock lock = new ReentrantLock();
    private static Condition notEmpty = lock.newCondition();
    private static Condition notFull = lock.newCondition();
    private static volatile  int count = 0;
    public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(6);
        pool.execute(new Gun(lock, notEmpty, notFull));
        pool.execute(new Bullet(lock, notEmpty, notFull));
    }

    public static class Gun implements Runnable {
        private Lock lock;
        private Condition notEmpty;
        private Condition notFull;

        public Gun(Lock lock, Condition notEmpty, Condition notFull) {
            this.lock = lock;
            this.notEmpty = notEmpty;
            this.notFull = notFull;
        }

        public void run() {
            while (true) {
                lock.lock();
                while (count == 0) {
                    try {
                        notEmpty.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("射击---biubiubiu");
                count--;
                notFull.signal();
                lock.unlock();
            }
        }
    }

    public static class Bullet implements Runnable {

        private Lock lock;
        private Condition notEmpty;
        private Condition notFull;

        public Bullet(Lock lock, Condition notEmpty, Condition notFull) {
            this.lock = lock;
            this.notEmpty = notEmpty;
            this.notFull = notFull;
        }

        public void run() {
            while (true) {
                lock.lock();
                while (count >= 20) {
                    try {
                        notFull.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("压入子弹---铛铛");
                count++;
                notEmpty.signal();
                lock.unlock();
            }
        }
    }

相关文章

  • Java多线程---枪有20发子弹,实现子弹不停上膛射出的过程,

    场景:一支枪可盛20发子弹,运用多线程,实现子弹不停上膛、射出的过程。一、基于信号量实现二、基于Reentrant...

  • 知识是经驯化的信息

    知识是枪加子弹,枪是人脑,被驯化的信息是子弹,知识就是子弹在枪里上膛的那种状态。 书本知识,组织内知识都是有内在结...

  • 让子弹休息一会

    当情绪累积 慢慢地累积 就像 上膛的子弹 压力足够时 子弹飞了出来 飞翔的子弹 释放了能量和情绪 要休息 躺枪的人...

  • 一颗子弹

    你是一把枪 爱是我给你的子弹 谁迫不及待把枪上膛 瞄准我的右眼,或者心脏 开枪吧,开枪 让子弹呼啸着嵌入什么 叫嚣...

  • 给布罗德

    在地洞里被不断审判, 一把枪抑或一颗子弹 都可能成为被告 子弹上膛,膛压住了子弹 镜子接纳的,无外乎眼之所及的幻像...

  • 土豪,请不要和我做朋友(75)

    文/晴天过后上一章 目录 枪已上膛,小九飞快射出子弹,对面的两个人火力更加密集,只感到胸口两下疼痛,...

  • 理想

    给我一把枪和一线希望把子弹上膛 趁天还没亮带我去革命的广场

  • 老妈旧作 原创小说《老妈“嘟嘟嘟”》

    从机关枪射出一颗子弹,如果迎面而来,会让人当场毙命,如果对着天空鸣枪,也会叫人虚惊一场,老妈胸膛里射出的子弹(字眼...

  • 老妈“嘟嘟嘟”

    从机关枪射出一颗子弹,如果迎面而来,会让人当场毙命,如果对着天空鸣枪,也会叫人虚惊一场,老妈胸膛里射出的子弹(字眼...

  • 设计模式——抽象工厂

    抽象工厂 1、什么产品——枪&子弹 2、定义枪的公共特性 3、手枪 4、机枪 5、手枪子弹 6、机枪子弹 7、枪厂...

网友评论

    本文标题:Java多线程---枪有20发子弹,实现子弹不停上膛射出的过程,

    本文链接:https://www.haomeiwen.com/subject/nmrkiqtx.html