Javaのマルチスレッド、sleep,notify,waitのサンプル
Advertisements
sleepは引数に指定した数値ミリ秒でスレッドを停止します。
package thread; public class SleepThreadTest { public static void main(String[] args){ for(int i = 0; i < 10; i++){ System.out.println("Good!"); //sleepメソッドはチェックされる例外なので、try~catchで囲む try{ Thread.sleep(1000); } catch(InterruptedException e){ } } } }
結果、1秒おきにGood!が表示されます。
Good! Good! Good! Good! Good! Good! Good! Good! Good! Good!
次にnotifyとwaitのサンプル。
何をしているかはコメントを見てみて下さい。
package thread; public class WaitAndNotifyTest { public static void main(String[] args){ final Kago kago = new Kago(); new Thread(){ public void run(){ try{ System.out.println("私はカゴに入れるスレッドです。\n 2秒眠ります・・・"); sleep(2000); }catch(InterruptedException e){ System.out.println("カゴにものを入れるスレッドが起こされました!"); } //買い物カゴに200円のモノを5個入れるイメージ kago.set(200,5); } }.start(); new Thread(){ public void run(){ try{ sleep(500); System.out.println("カゴにある料金を計算します!"); }catch(InterruptedException e){ System.out.println("取り出しスレッドが起こされました"); } System.out.println(kago.calc()); } }.start(); } } class Kago{ private long price = 0; private int quantity = 0; public synchronized void set(long price, int quantity) { this.price = price; try{ Thread.sleep(1000); } catch(InterruptedException e){ } this.quantity = quantity; //setが終わったので、waitしているスレッドをたたき起こす notify(); } public synchronized String calc(){ if(price == 0 && quantity == 0){ //waitメソッドもtry~catchで囲む。チェックされる例外 try{ System.out.println("カゴに入るまで待ちます・・・"); //waitが実行されると、notifyされるまで待ち続ける wait(); } catch(InterruptedException e){ System.out.println("起こされました!!"); } } long total = price * quantity; return "値段:" + price + "円 × " + quantity + "個 = " + total; } }
結果は以下のとおり、セットが終わるのを待ってから計算が実行されます。
私はカゴに入れるスレッドです。 2秒眠ります・・・ カゴにある料金を計算します! カゴに入るまで待ちます・・・ 値段:200円 × 5個 = 1000