采用多线程技术,例如wait/notify,设计实现一个符合生产者和消费者问题的程序,对某一个对象(枪膛)进行操作,其最大容量是20颗子弹,生产者线程是一个压入线程,它不断向枪膛中压入子弹,消费者线程是一个射出线程,它不断从枪膛中射出子弹。
package com.kelley; public class Demo052901 { public static final Integer MAX_SIZE = 20; public static final Integer MIN_SIZE = 0; private static class Gun{ private int num; synchronized void input() { try { while (num >= MAX_SIZE) { System.err.println("弹匣已满,无法装弹"); wait(); } num ++; System.out.println("弹匣未满,开始装弹,现有子弹:" + num); notifyAll(); } catch (InterruptedException e) { e.printStackTrace(); } } synchronized void output() { try { while (num <= MIN_SIZE) { System.err.println("弹匣已空,无法射击"); wait(); } System.out.println("弹匣有弹,开始射击,现有子弹:" + num); num --; System.out.println("射击完还剩子弹:" + num); notifyAll(); } catch (InterruptedException e) { e.printStackTrace(); } } } private static class Input implements Runnable{ public Gun gun; public Input(Gun gun){ this.gun = gun; } @Override public void run() { while(true){ gun.input(); } } } private static class Output implements Runnable{ public Gun gun; public Output(Gun gun){ this.gun = gun; } @Override public void run() { while(true){ gun.output(); } } } public static void main(String[] args) { Gun gun = new Gun(); Thread threadInput = new Thread(new Input(gun)); threadInput.start(); Thread threadOutput = new Thread(new Output(gun)); threadOutput.start(); } }