5月19日

スレッド

スレッドはJavaVMで並行処理を行う仕組みです。

プロセスとスレッド

プロセスはアプリケーションが動作する単位。スレッドは、ひとつのアプリケーション内で並行処理をするための単位。

スレッドの作成方法

CHAPTER25に入ったので、新しくプロジェクトc25を作成する。

Threadクラスを使ったスレッドの利用方法の例として、テキストのLIST 25-01 MyThread.java を入力して実行する。

Runnableインタフェースを使ったスレッドの利用方法の例として、テキストのLIST 25-02 MyRunnable.java を入力して実行する。

それぞれ、クラスのファイルはクラスごとに分ける。run()メソッドのオーバーライドには、@Override アノテーションをつけておく。

ThreadクラスのJavadocを確認すると、Threadクラスもimplements Runnableしていることがわかる。

sleep()メソッドを使った例として、テキストのLIST 25-03 SleepThread.java を入力して実行する。

複数のスレッドを使用する例として、テキストのLIST 25-04 SleepThreadTest2.java を入力して実行する。

スレッドの動機

Javaでは、synchronizedキーワードを使用してスレッドの動機を行う。

スレッドを同期する例として、テキストの LIST 25-05 DojiSample.java を入力して実行する。CountThreadは、別ファイルとして作成すること。

DojiSample.java

public class DojiSample {
	Integer count = new Integer(1);

	void countUp() {
		int tmpValue = count.intValue() + 1;
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		count = new Integer(tmpValue);
	}
	void doSample() {
		new CountThread(this).start();
		new CountThread(this).start();
	}
	public static void main(String[] args) {
		new DojiSample().doSample();
	}
}

CountThread.java

public class CountThread extends Thread {
	private DojiSample dojiSample;
	public CountThread(DojiSample ds) {
		dojiSample = ds;
	}
	@Override
	public void run() {
		dojiSample.countUp();
		System.out.println(getName() + " count=" + dojiSample.count.intValue());
	}
}

synchronizedブロックを使用して動機を行う場合は、synchronized に続く括弧の中に動機のキーにするオブジェクトを記述する。たとえば、テキストの例にあるような count をキーにした場合は、キーとなっている count のインスタンスに最初にアクセスしたスレッドが実行権を獲得する。2番目のスレッドがcountをキーにしたsynchronizedブロックを実行しようとしたときに、実行が待たされる。最初に実行権を獲得したスレッドがsynchronizedブロックから抜けると、2番目のスレッドが実行権を獲得できる。

メソッドのsynchronized修飾子を使う場合は、そのメソッドが定義されているクラスのインスタンスが、動機のキーとなる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です