『Effective Java 第3版』と『Java Puzzlers』ー パズル77ー
『Effective Java 第3版』の「項目82 スレッド安全性を文書化する」で参照されているのは、パズル77です。
パズル77 ロックを混乱させる怪物(The Lock Mess Monster)
このプログラムは、ちょっとした職場シミュレーションを行います。退社時間まで仕事をする、あるいは、少なくとも仕事をしているふりをするワーカースレッドを、プログラムは開始します。 それから、決して退社時間にならないようにしようとしている邪悪な上司を表しているタイマータスクを、プログラムはスケジュールします。 最後に、良い上司を表しているメインスレッドは、ワーカーに退社時間だと告げて、ワーカーが終了するのを待ちます。 このプログラムは、何を表示しますか?
import java.util.*;
public class Worker extends Thread {
private volatile boolean quittingTime = false;
public void run() {
while (!quittingTime)
pretendToWork();
System.out.println("Beer is good");
}
private void pretendToWork() {
try {
Thread.sleep(300); // 仕事中に寝ている?
} catch (InterruptedException ex) { }
}
// 退社時間。作業者を待つ - 良い上司から呼ばれる
synchronized void quit() throws InterruptedException {
quittingTime = true;
join();
}
// 退社時間を取り消す - 邪悪な上司から呼ばれる
synchronized void keepWorking() {
quittingTime = false;
}
public static void main(String[] args)
throws InterruptedException {
final Worker worker = new Worker();
worker.start();
Timer t = new Timer(true); // デーモンスレッド
t.schedule(new TimerTask() {
public void run() { worker.keepWorking(); }
}, 500);
Thread.sleep(400);
worker.quit();
}
}


この記事へのコメント