IT@程序员猿媛程序员

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

2019-04-05  本文已影响3人  nosixtools

场景:一支枪可盛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();
            }
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读