スレッドの同期(wait・notify・notifyall)スレッドの同期(wait・notify・notifyall)|Javaから楽しく学ぶ!ゲームプログラミング専門学校Javaから楽しく学ぶ!ゲームプログラミング専門学校ゲームプログラミングとはその名のとおりゲームのプログラムを作ることを指します。『Javaから楽しく学ぶ!ゲームプログラミング専門学校』ではゲームプログラミングについて、実際にゲームプログラムをJAVAプログラミング言語を使用し、作成していきながら詳しく解説していきます。»スレッドの同期(wait・notify・notifyall)スレッドの同期(wait・notify・notifyall)スレッドのしくみJavaは、スレッドをある状態で待機させ、別のスレッドから通知が来た時点で処理を再開するといったしくみを作ることができます。そのようなしくみは、java.lang.Objectクラスのwait()メソッド、notify()メソッド、notifyAllメソッドを使うことで実現できます。notifyAll()メソッドを呼び出すまで、現在のスレッドを待機させます。wait()メソッドによって待機中であるスレッドの1つを再開します。プログラム側から指定することはできません。wait()メソッドによって待機中であるすべてのスレッドを再開します。これらのメソッドを使ったサンプルを下記に示します。}}上記サンプルはJavaアプレットとして定義しています。アプレットが開始・再開されるときに呼ばれるstart()メソッド内で新しいスレッドを作成し、起動させています。動作確認スレッドが起動することで呼ばれるrun()メソッド内ではfor文で5回ループさせています。そのforブロック内にあるaddCount()メソッドに着目してください。}count変数をインクリメントさせたら、wait()メソッドを呼び出しています。wait()メソッドが呼び出された時点でこのスレッドは待機状態になります。待機状態であるスレッドを再開させるには、notify()メソッドかnotifyAll()メソッドを別のスレッドから呼び出す必要があり、その処理をreStart()メソッドで行っています。reStart()メソッドはマウスをクリックしたときに呼ばれるmousePressed()メソッドから呼び出しています。}これで、wait()メソッドによって待機状態であったスレッドが再開します。ここで、wait()メソッド、notifyAll()メソッドを呼び出しているメソッドに、synchronizedが指定されていることに着目してください。wait()メソッド、notify()メソッド、notifyAll()メソッドを呼び出すためには、スレッドは該当するオブジェクトのロックを取得しておく必要があります。そのため、synchronized指定をはずすとコンパイルエラーとなります。スレッドの排他制御(synchronized)サンプルはアプレット画面をクリックする度に待機中であるスレッドを再開させており、それを5回繰り返しています。実際にサンプルを動かしてみてプログラムの動作を確認してみてください。