progJ-e.pdf にprogJ.pdf の[#47]に対応する部分は Now や QueR のサブクラスで演習する予定ですがwait( ), notify( ) の使い方が分かり難いので,独立した Hello のサブクラスで少し詳しく説明します(progJ-e.pdf では割愛).なお,上図のようにメソッド内のブロックだけを「synchronized」にすることもできますが,以下では簡単のためメソッド全体を「synchronized」にします.
本格的に勉強したい人は [1],[2] を読んでください.手抜きで「wait notify 使い方」や「wait notify tutorial」を Google で検索すると[3]~[14] 等が見つかります.使い方の例は一つのメソッドに notify() と wait() が対になったものとそうでないものに大別できます --- 前者の構成を基本にする方が分かり易いと思います.後者の構成は,例えば [4] では解決済みの回答として
public class SomeData{
synchronized void get( ){if(空){wait( );} /* データ取得処理 */}
synchronized void put( ){/* データ収納処理 */ notify( );}
}
が示されています.この構成で [11] の処理を
public class Hishi extends Thread {
Object lock; int k;
void msleep(String s, int ms){//予測
try{
System.out.println(s +" sleep"+ ms +" start");
Thread.sleep(ms);
System.out.println(s +" sleep"+ ms +" end");
}catch(Exception e){ }
}
public void thread1( ) {//原文どおり
System.out.println("W1 start");
synchronized (lock) {
System.out.println("W1 lock start");
msleep("W1",200);
try {
System.out.println("W1 wait start");
lock.wait( );
System.out.println("W1 wait end");
} catch (InterruptedException e) {
}
msleep("W1",1000);
System.out.println("W1 lock end");
}
System.out.println("W1 end");
}
public void thread2( ) {//原文どおり
System.out.println("W2 start");
synchronized (lock) {
System.out.println("W2 lock start");
msleep("W2",100);
System.out.println("W2 notify start");
lock.notify( );
System.out.println("W2 notify end");
msleep("W2",1000);
System.out.println("W2 lock end");
}
msleep("W2",1000);
System.out.println("W2 end");
}
public synchronized void run( ){//手抜き
lock = new Object( );
if(k == 1){thread1( );}
else if(k == 2){thread2( );}
else{
try{sleep(5000);}catch(Exception e){ }
notifyAll( );
System.out.println("notifyAll( ) end");
}
}
public static void main(String[ ] args) {
Hishi h0, h1, h2;
h0 = new Hishi( ); h0.k = 0; h0.start( );
h1 = new Hishi( ); h1.k = 1; h1.start( );
h2 = new Hishi( ); h2.k = 2; h2.start( );
}
}
と具体化すると原文と類似の実行結果が得られます.多くの資料を読み比べるのをサボって「自分で調べるCのポインタ」 と同様「自分で調べる Java のスレッド」として NetBeansIDE を使って Hello.java のサブクラスを考えて見ましょう.
[1] Java言語規定 第2版 / 17. スレッド及びロック
http://www.y-adagio.com/public/standards/tr_javalang2/memory.doc.html#30206
(17.13 ロック及び同期,17.14 待機集合及び通知,etc.)
[2] The Java Tutorials / Concurrency / Synchronization
http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html
{syncmeth.html, locksync.html, deadlock.html, guardmeth.html, etc.}
--------
[3] [java wait]についての検索結果 ( 約55件中 1~10件を表示 ) - 教えて ...
http://oshiete.goo.ne.jp/search_goo/result?code=utf8&MT=java+wait
[4] javaのwaitしてるスレッドをnotifyで起こすことが出来ない | JavaのQ&A ...
http://okwave.jp/qa/q4542536.html
http://oshiete.goo.ne.jp/qa/4542536.html
http://soudan1.biglobe.ne.jp/qa4542536.html
[5] Java 入門 | wait()/notify() - FC2Web
http://msugai.fc2web.com/java/thread/waitnotify.html
[6] Javaの道>掲示板(wait()の使い方)
http://www.javaroad.jp/bbs/answer.jsp?q_id=20090222134150310
[7] コマンド終了待ち時のタイムアウト処理 - Java Solution - @IT
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=33873&forum=12
[8] 5. スレッドの同期 (2) | TECHSCORE(テックスコア)
http://www.techscore.com/tech/Java/JavaSE/Thread/5-2/
[9] Javaの道:スレッド(4.スレッドの同期)
http://www.javaroad.jp/java_thread4.htm
[10] Java Program Examples / 相互に干渉するスレッドの実行
http://bach.istc.kobe-u.ac.jp/java/examples/Ex0211a.java
[11] Javaスレッドメモ(Hishidama's Java thread Memo)
http://www.ne.jp/asahi/hishidama/home/tech/java/thread.html
[12] wait(), notify() and notifyAll() in Java - A tutorial
http://www.java-samples.com/showtutorial.php?tutorialid=306
[13] A good small example to demonstrate wait() and notify() method in java
http://stackoverflow.com/questions/8358600/
[14] How do I use the wait() and notify() methods? - Web Tutorials ...
http://www.avajava.com/tutorials/lessons/how-do-i-use-the-wait-and-notify-methods.html