package star20110715;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class WaxOMatic2 {
public static void main(String[] args) throws InterruptedException{
Car car = new Car();
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new waxOn(car));
executorService.execute(new Buffer(car));
TimeUnit.SECONDS.sleep(30);
executorService.shutdownNow();
}
}
class Car{
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
private boolean waxOn = false;
public void waxed(){
lock.lock();
try {
waxOn = true;
System.err.println("正在打蜡");
condition.signalAll();
} finally{
lock.unlock();
}
}
public void buffered(){
lock.lock();
try {
waxOn = false;
System.err.println("正在抛光");
condition.signalAll();
} finally{
lock.unlock();
}
}
public void waitWax() throws InterruptedException{
lock.lock();
try {
while(waxOn == false){
condition.await();
}
} finally{
lock.unlock();
}
}
//如果车子现在已经打蜡了,那么车子现在就要等待啊。
public void waitBuffer() throws InterruptedException{
lock.lock();
try {
while(waxOn == true){
condition.await();
}
} finally{
lock.unlock();
}
}
}
class waxOn implements Runnable{
private Car car;
public waxOn(Car car) {
this.car = car;
}
@Override
public void run() {
try {
while(!Thread.interrupted()){
System.out.println("开始打蜡");
car.waxed();
TimeUnit.SECONDS.sleep(3);
car.waitBuffer();
}
} catch (InterruptedException e) {
System.out.println("打蜡结束");
}
}
}
class Buffer implements Runnable{
private Car car;
public Buffer(Car car) {
this.car = car;
}
@Override
public void run() {
try {
while(!Thread.interrupted()){
car.waitWax();
System.out.println("开始抛光");
car.buffered();
TimeUnit.SECONDS.sleep(3);
}
} catch (InterruptedException e) {
System.out.println("抛光结束");
}
}
}