top / index / prev / next / target / source

2007-08-08 diary: Java: サンプル: 複数のスレッドの協調動作

いがぴょん画像(小) 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

Java: サンプル: 複数のスレッドの協調動作

私のニガテな wait + notify , blanco Frameworkは 今後ともしばらくの間は Sun JDK 1.4.2をビルド環境とします

Java: サンプル: 複数のスレッドの協調動作

a-sanの日記に触発され、複数のスレッドの協調動作を私も簡単に調べました。ただし 私は いまだに wait + notify について完全に理解できているわけではありません。

より一般化すると、こういった感じになると思いました。(間違っているかも知れませんけれども)

ポイントは

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

時間を作って、結城浩さまのスレッド本で 上記内容の妥当性を確認しておきたい、と考えました。、、、時間を確保せねば…。

再確認: blanco Frameworkは 今後ともしばらくの間は Sun JDK 1.4.2をビルド環境とします

JRubyに関する下記の記事をみて、記憶を呼び起こさせられました。

Java実行環境において、ターゲットから 1.4.2系を取り除いて (無視して) 良い時代というものは、いまだ到来していなのであると、私達は考えているのです。

関連する日記


この日記について