import java.util.concurrent.*;
class Car{ // 类名改成汽车美容馆还差不多,呵呵
private boolean waxOn = false;
public synchronized void waxed() {
waxOn = true;
System.out.println("打蜡工作做完了!!!");
notifyAll();
}
public synchronized void buffed(){
waxOn = false;
System.out.println("抛光工作做完了!!");
notifyAll();
}
public synchronized void waitForWaxing() throws InterruptedException{
System.out.println("等打蜡中。。。");
while(waxOn == false)
wait(); // 如果没有开始打蜡,释放对象锁,挂起,等待打蜡的哥们打蜡去
}
public synchronized void waitForBuffing() throws InterruptedException{
System.out.println("等抛光中。。。");
while(waxOn == true)
wait(); // 如果正在进行打蜡工作,释放对象锁,挂起,等待抛光的哥们把工作做完
}
}
class WaxOn implements Runnable{
private Car car;
public WaxOn(Car c){
this.car = c;
}
@Override
public void run() {
// TODO Auto-generated method stub
try{
while(!Thread.interrupted()){
System.out.print("Wax On! ");
TimeUnit.MICROSECONDS.sleep(300); // 模拟打蜡的工作时间
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() {
// TODO Auto-generated method stub
try{
while(!Thread.interrupted()){
car.waitForWaxing();
System.out.print("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 {
// TODO Auto-generated method stub
Car car = new Car();
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new WaxOff(car));
exec.execute(new WaxOn(car));
TimeUnit.SECONDS.sleep(5);
exec.shutdownNow();
}
}