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();} } } } }