最近、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入れてチェックしたところ、裏できちんとロックを取っているようだった。
やってくると思い出してくるし、確認も出来る。