top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
私のニガテな wait + notify , blanco Frameworkは 今後ともしばらくの間は Sun JDK 1.4.2をビルド環境とします
a-sanの日記に触発され、複数のスレッドの協調動作を私も簡単に調べました。ただし 私は いまだに wait + notify について完全に理解できているわけではありません。
より一般化すると、こういった感じになると思いました。(間違っているかも知れませんけれども)
ポイントは
synchronized ブロックに入ってきた時点で すでにロックは取得している。 ※なお、この例では 複数クラスの協調動作であるので synchronizedメソッドではダメ。
notify したら すぐに waitして 他のスレッドに動作を贈与する。 SampleThreadNotify.java
``` public class SampleThreadNotify { /** * 複数の処理を協調動作させるためのロックオブジェクト。 */ private static final Object lockObject = new Object();
class ThreadA extends Thread { public void run() { for (int loopCounter = 1; loopCounter <= 10; loopCounter++) { try { synchronized (lockObject) { System.out.println("A" + loopCounter); lockObject.notify(); lockObject.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } } } }
class ThreadB extends Thread { public void run() { for (int loopCounter = 1; loopCounter <= 10; loopCounter++) { try { synchronized (lockObject) { System.out.println("B" + loopCounter); lockObject.notify(); lockObject.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } } } }
public void process() { ThreadA threadA = new ThreadA(); ThreadB threadB = new ThreadB(); threadA.start(); threadB.start(); }
public static void main(final String[] args) { new SampleThreadNotify().process(); } } ```
これは、不思議なことに、下記のような synchronizedで囲った記法でも同様の効果があるものと思います。 SampleThreadNotify2.java
public class SampleThreadNotify2 {
/**
* 複数の処理を協調動作させるためのロックオブジェクト。
*/
private static final Object lockObject = new Object();
class ThreadA extends Thread {
public void run() {
try {
synchronized (lockObject) {
for (int loopCounter = 1; loopCounter <= 10; loopCounter++) {
System.out.println("A" + loopCounter);
lockObject.notify();
lockObject.wait();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class ThreadB extends Thread {
public void run() {
try {
synchronized (lockObject) {
for (int loopCounter = 1; loopCounter <= 10; loopCounter++) {
System.out.println("B" + loopCounter);
lockObject.notify();
lockObject.wait();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void process() {
ThreadA threadA = new ThreadA();
ThreadB threadB = new ThreadB();
threadA.start();
threadB.start();
}
public static void main(final String[] args) {
new SampleThreadNotify2().process();
}
}
時間を作って、結城浩さまのスレッド本で 上記内容の妥当性を確認しておきたい、と考えました。、、、時間を確保せねば…。
JRubyに関する下記の記事をみて、記憶を呼び起こさせられました。
Java実行環境において、ターゲットから 1.4.2系を取り除いて (無視して) 良い時代というものは、いまだ到来していなのであると、私達は考えているのです。
関連する日記
2006/12/12 日記: Sun Java SE 6 (JDK 1.6) リリース この日記で、blanco Framework が 1.4.2ベースで当面進むということが宣言されています。