Java: Re: サンタクロース問題

[id:lethevert:20070611:p1]
昨日のあれは、オレンジニュースからリンクされたようで、なんでリンクされたのかよくわからないですが。
ところで、[id:sumim:20070608:p1]とかを見て、Javaも日本語が通るのだったと思い出してやってみた。

import java.util.*;

public class サンタ {
  static volatile boolean 動作中 = true;
  static ArrayList<仲間> トナカイ用 = new ArrayList<仲間>(9);
  static LinkedList<仲間> 小人用 = new LinkedList<仲間>();

  static class 仲間 extends Thread {
    final List<仲間> 待合所;
    final String 名前;
    仲間 (String な, List<仲間> ま){ this.名前 = な; this.待合所 = ま;}
    public void run ()
    {
      while (動作中){
        try{
          sleep((long)Math.ceil(Math.random()*1000));
          System.out.println(名前 + "が来た。");
          synchronized(待合所){ 待合所.add(this);}
          synchronized(this){ this.wait();}
        }catch(InterruptedException e){}
      }
    }
  }

  public static void main (String 引数[])
  {
    仲間[] トナカイたち = new 仲間[9];
    仲間[] 小人たち = new 仲間[10];
    for (int 数=0; 数<トナカイたち.length; ++数) トナカイたち[数] = new 仲間("トナカイ" + (数+1), トナカイ用);
    for (int 数=0; 数<小人たち.length; ++数) 小人たち[数] = new 仲間("小人" + (数+1), 小人用);
    for (仲間 トナカイ: トナカイたち) トナカイ.start();
    for (仲間 小人: 小人たち) 小人.start();

    int 回数 = 0;
    try{
      while (回数<10){
        Thread.sleep(10);
        boolean 目印 = false;
        synchronized (トナカイ用){
          目印 = トナカイ用.size() >= 9;
        }
        if (目印){ 配達(); ++回数; continue;}
        synchronized (小人用){
          目印 = 小人用.size() >= 3;
        }
        if (目印){ 会議(); ++回数; continue;}
      }
    }catch(InterruptedException 例外){}

    動作中 = false;
    for (仲間 トナカイ: トナカイたち) トナカイ.interrupt();
    for (仲間 小人: 小人たち) 小人.interrupt();
  }

  static void 配達() throws InterruptedException
  {
    System.out.println("配達・・・");
    Thread.sleep((long)Math.ceil(Math.random()*1000));
    synchronized (トナカイ用){
      for (仲間 トナカイ: トナカイ用){
        System.out.println(トナカイ.名前 + "が帰った。");
        synchronized(トナカイ){ トナカイ.notify();}
      }
      トナカイ用.clear();
    }
  }

  static void 会議() throws InterruptedException
  {
    System.out.println("会議・・・");
    Thread.sleep((long)Math.ceil(Math.random()*1000));
    synchronized (小人用){
      for (int 数=0; 数<3; ++数){
        仲間 小人 = 小人用.remove(0);
        System.out.println(小人.名前 + "が帰った。");
        synchronized(小人){ 小人.notify();}
      }
    }
  }
}