场景:一支枪可盛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();
}
}
}
网友评论