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