java threadの走り書きメモ

最近、PythonやらErlangをちょこちょこやっていたので、
久しぶりにjavaをいじろうと思ったものの、すごい忘れている。。
スレッドに関しても好きだったのに、忘れていてちょっとショックだった。
ちなみにPythonは数学系の人が開発し、Perlは言語系の人が開発したため、
ある処理を書くのにPythonではおおよその人が同じ書き方をするのに対し、
Perlでは人それぞれの書き方になるらしい。
Pythonは可読性が非常に良い、ということになるそうで。

閑話休題
さて、synchronizedブロックとwait,notifyのところが少々曖昧になっているため、ショットしたサンプルを作成して実験。これはそのメモ。

Runnableのrunメソッド内に以下を書く。

Runnable r = null;
while(true) {
    synchronized(queue) {
        while(queue.isEmpty()) {
	    try {
                   queue.wait();
	    }catch (InterruptedException e) {
		//ignore
            }
        }
	r = queue.removeFirst();
    }
    try { 
       r.run();
    }catch(RuntimeException e) {
       //rの処理の後始末
    }finally {
       r = null;
    }
}

簡単に言うと、キューに何か入れたらnotifyで睡眠中のスレッド達を起こして処理させる、ということをするもの。
忘れていた部分は、この辺りで、
notifyが呼ばれたら、waitのところから処理が再開されるのかsynchronizedブロックの初めに戻るのか忘れてしまい、疑問だった。
実施したところ、前者の通りになった。
となると、一見waitでロック解放しているのに、synchronizedブロック内のループ処理が作動していると思ってしまうが、System.out.print入れてチェックしたところ、裏できちんとロックを取っているようだった。

やってくると思い出してくるし、確認も出来る。