山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

スレッドの協調

スレッド間の通信

久しぶりにわかりやすJava オブジェクト指向編の記事を書きたいと思います。

わかりやすいJavaオブジェクト指向編

わかりやすいJavaオブジェクト指向編

この本の15章8節スレッドの協調―スレッドの通信―では、スレッド通信を用いた排他制御の内容です。

wait()メソッドとnotify()メソッドを用いて排他制御を行います。

コード

class CookingRoom{
    boolean flag;
    int dish = 0;
    synchronized void cook() {
        while(flag) {
            try {
                wait();
            }catch(InterruptedException e) {}
        }
        dish ++;
        flag = true;
        notifyAll();
    }
    synchronized void spread() {
        while(!flag) {
            try {
                wait();
            }catch(InterruptedException e) {}
        }
        System.out.println(dish + "番目の料理");
        flag = false;
        notifyAll();
    }
}

class CookingRoom2 extends CookingRoom{
    int dish = 0;
    synchronized void cook() {
        dish ++;
    }
    synchronized void spread() {
        System.out.println(dish + "番目の料理");
    }
}

class Cook implements Runnable{
    CookingRoom room;
    public Cook(CookingRoom room) {
        this.room = room;
    }
    public void run() {
        room.cook();
    }
}

class Waiter implements Runnable{
    CookingRoom room;
    public Waiter(CookingRoom room) {
        this.room = room;
    }
    public void run() {
        room.spread();
    }
}
public class Exec {
    public static void main(String[] args) {

        // CookとWaiterオブジェクトはどれも同じルームを使って初期化
        // することに注意
//     CookingRoom room = new CookingRoom();
//
//     Thread t1 = new Thread(new Cook(room));
//     Thread t2 = new Thread(new Cook(room));
//     Thread t3 = new Thread(new Cook(room));
//     Thread t4 = new Thread(new Waiter(room));
//     Thread t5 = new Thread(new Waiter(room));
//     Thread t6 = new Thread(new Waiter(room));
//
//     System.out.println("協調するスレッド");
//     t1.start();
//     t2.start();
//     t3.start();
//     t4.start();
//     t5.start();
//     t6.start();

        System.out.println("協調しないスレッド");
        CookingRoom room2 = new CookingRoom2();
        Thread t01 = new Thread(new Cook(room2));
        Thread t02 = new Thread(new Cook(room2));
        Thread t03 = new Thread(new Cook(room2));
        Thread t04 = new Thread(new Waiter(room2));
        Thread t05 = new Thread(new Waiter(room2));
        Thread t06 = new Thread(new Waiter(room2));

        t01.start();
        t02.start();
        t03.start();
        t04.start();
        t05.start();
        t06.start();
    }
}

参考サイト

www.javaroad.jp