涂完蜡才能抛光,抛光完又可以涂蜡
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();
}
}