スレッドの協調
スレッド間の通信
久しぶりにわかりやすJava オブジェクト指向編の記事を書きたいと思います。
- 作者: 川場隆
- 出版社/メーカー: 秀和システム
- 発売日: 2010/03/25
- メディア: 単行本
- 購入: 4人 クリック: 34回
- この商品を含むブログ (9件) を見る
この本の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(); } }