涂完蜡才能抛光,抛光完又可以涂蜡
class Car{ private boolean waxOn=false; /** * 涂蜡 */ public synchronized void waxed(){ waxOn=true; notify(); } /** * 抛光 */ public synchronized void buffed(){ waxOn=false; notifyAll(); } /** * 等待涂蜡,如果当前没有涂蜡,则一直等待 * @throws InterruptedException */ public synchronized void waitForWaxing() throws InterruptedException{ while(waxOn==false) wait(); } /** * 等待抛光,如果当前已经涂蜡,则使涂蜡一直等待 * @throws InterruptedException */ public synchronized void waitForBuffing() throws InterruptedException{ while(waxOn==true) wait(); } } class WaxOn implements Runnable{ private Car car; public WaxOn(Car c){ car=c; } @Override public void run() { try{ while(!Thread.interrupted()){ System.out.println("Wax On! "); TimeUnit.MILLISECONDS.sleep(200); //涂蜡,并唤醒抛光线程 car.waxed(); //使涂蜡等待 car.waitForBuffing(); } }catch (InterruptedException e){ System.out.println("Exiting via interrupt"); } System.out.println("Ending Wax On task"); } } class WaxOff implements Runnable{ private Car car; public WaxOff(Car c){ car=c; } @Override public void run() { try{ while(!Thread.interrupted()){ //等待涂完蜡 car.waitForWaxing(); System.out.println("Wax off!"); TimeUnit.MILLISECONDS.sleep(200); //抛光,并唤醒涂蜡线程 car.buffed(); } }catch (InterruptedException e){ System.out.println("Exiting via interrupt"); } System.out.println("Ending Wax Off task"); } } public class WaxOMatic { public static void main(String[] args) throws Exception{ Car car=new Car(); ExecutorService exec= Executors.newCachedThreadPool(); exec.execute(new WaxOff(car)); exec.execute(new WaxOn(car)); TimeUnit.SECONDS.sleep(5); exec.shutdownNow(); } }