Java发射子弹出错,Java多线程---枪有20发子弹,实现子弹不停上膛射出的过程,生产者消费者...
发布日期:2021-06-24 19:28:32 浏览次数:17 分类:技术文章

本文共 2536 字,大约阅读时间需要 8 分钟。

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

}

}

}

转载地址:https://blog.csdn.net/weixin_34262786/article/details/116064304 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java的intanceof深层原理,instanceof的判断原理
下一篇:c 转php代码,通过CGI脚本将PHP转换为C/C++

发表评论

最新留言

很好
[***.229.124.182]2024年04月01日 11时52分30秒