下面的这段程序模拟了一个小车间。程序首先启动了一个工人线程,该线程在停
止时间到来之前会一直工作(至少是假装在工作),然后程序安排了一个定时器
任务(timer task)用来模拟一个恶毒的老板,他会试图阻止停止时间的到来。
最后,主线程作为一个善良的老板会告诉工人停止时间到了,并且等待工人停止
工作。
首先这个程序我做了修改,使之能够达到目的,同时在源程序中有注释说明了一种一种不正确的方法
package com.yinbodotcc;
/*
*
* 如果方法的声明形式时用synchronized做用与方法名上,则这题需要提醒你:
* join();方法会释放Worker线程的锁,因为join方法的背后是wait。
* 所以那样的话,这里的员工永远不知道quittingTime为true,即"Beer is good"不会被打印出来
*
*
*/
import java.util.*;
public class Worker extends Thread
{
private final static Object lock=new Object();
private volatile boolean quittingTime = false;
public void run()
{
while (!quittingTime)
pretendToWork();
System.out.println("Beer is good");
}
private void pretendToWork()
{
try {
Thread.sleep(300); // Sleeping on the job?
}
catch (InterruptedException ex) { }
}
void quit() throws InterruptedException
{
synchronized(lock)
{
quittingTime = true;
join();
}
}
void keepWorking()
{
synchronized(lock)
{
quittingTime = false;
}
}
public static void main(String[] args) throws InterruptedException
{
final Worker worker = new Worker();
worker.start();
Timer t = new Timer(true); // Daemon thread
t.schedule(new TimerTask() {
public void run() { worker.keepWorking(); }}, 500);
Thread.sleep(400);
worker.quit();
}
}