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
