Going my way

いいなと思ったことをメモしていきます。

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