スレッド

みるくあいらんどっ! > ドキュメント > Java > じっくり学ぶ Java講座 [初心者向け・入門]


独自の処理を実行するスレッドを作る

Threadクラスを用いて、独自の処理を行う新しいスレッドを作成するためには、以下の 2種類の方法があります。

  • Threadクラスを継承したクラスを利用する。
  • Runnableインターフェイスを実装したクラスと Threadクラスを利用する。

その後、Threadクラスの startメソッドによって、新しいスレッドが生成されます。

前者の方法の利点は、小規模なプログラムを作成する場合には分かりやすいことです。後者の方法の利点は、インターフェイスを利用するため、スーパークラスに制約がないことです。本節では、前者の方法、後者の方法ともに、解説したいと思います。

これらについて詳細が気になる方は、説明書(API)を参照してください。Java SE 7(Java 1.7)の説明書(API)を掲示しておきます→ThreadクラスRunnableインターフェイス

Threadクラスを継承したクラスを利用する

概要

Threadクラスを拡張したクラス MyThreadを作ります。その runメソッドをオーバーライドして、処理を記述します。

メインメソッドからは、MyThread型インスタンスを作成し、startメソッドでスレッドを開始します。

サンプルプログラム

mainスレッドでは「おはようございます。」、新スレッドでは「こんにちは。」を表示するプログラムを作成します。

ソースコードは以下の通り。

Q201/MyThread.java

/**
 * スレッドを継承したクラスです。
 */
public class MyThread extends Thread {
	
	@Override
	public void run() {
		System.out.println("現在のスレッドは" + Thread.currentThread().getName() + "です。");
		for(int i = 0; i < 5; i ++) {
			System.out.println("こんにちは。");
			
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				; // 何もしない
			}
		}
	}
}

Q201/Q201.java

/**
 * Threadクラスを継承して、マルチスレッドを実現します。
 */
public class Q201 {
	
	/**
	 * メインメソッド。
	 * @param args 引数
	 */
	public static void main(String[] args) {
		System.out.println("現在のスレッドは" + Thread.currentThread().getName() + "です。");
		MyThread myThread = new MyThread();
		
		// 新しいスレッドを実行する
		myThread.start();
		
		for(int i = 0; i < 5; i ++) {
			System.out.println("おはようございます。");
			
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				; // 何もしない
			}
		}
	}
}

実行結果の例は以下の通り。

現在のスレッドはmainです。
おはようございます。
現在のスレッドはThread-0です。
こんにちは。
こんにちは。
おはようございます。
おはようございます。
こんにちは。
こんにちは。
おはようございます。
こんにちは。
おはようございます。
現在のスレッドはmainです。
おはようございます。
現在のスレッドはThread-0です。
こんにちは。
おはようございます。
こんにちは。
こんにちは。
おはようございます。
おはようございます。
こんにちは。
こんにちは。
おはようございます。

「おはようございます」と「こんにちは」が入り乱れて表示されています。mainスレッドが mainメソッドを、Thread-0スレッドが、runメソッドの内容を実行していることが分かります。

なお、Thread.sleep(100);は、相互のスレッドをより入り乱せるために記述しました。これを記述しないと、一方のスレッドが全部処理を終えて、そのあともう一方のスレッドが処理をし始める場合がとても多くなります。お使いのパソコン環境によっては、マルチスレッドという実感が湧かなくなる可能性があるため、記述しました。

Runnableインターフェイスを実装したクラスと Threadクラスを利用する

概要

Thread型インスタンスをRunnableインターフェイスを実装したクラスのインスタンスを指定して作成します。

Thread型インスタンスのstartメソッドを呼び出して、スレッドを開始します。このとき、Runnableインターフェイスを実装したクラスのrunメソッドが実行されます。

サンプルプログラム

Runnableインターフェイスを利用してスレッドを作成したプログラムの例は以下の通りです。

サンプルプログラムでは Runnableインターフェイスを自身のクラスで実装します。自身のインスタンスを作成し、予約語 thisを使用するために、Q202型インスタンスを作成しています。

ソースコードは以下の通り。

Q202/Q202.java

/**
 * Runnableインターフェイスと Threadクラスにより、マルチスレッドを実現します。
 */
public class Q202 implements Runnable {
	
	/**
	 * メインメソッド。
	 * @param args 引数
	 */
	public static void main(String[] args) {
		Q202 q202 = new Q202();
		q202.execute();
	}
	
	/**
	 * 実行します。
	 */
	public void execute() {
		System.out.println("現在のスレッドは" + Thread.currentThread().getName() + "です。");
		
		// スレッドクラスを作成し、スレッドを開始する
		Thread thread = new Thread(this);
		thread.start();
		
		for(int i = 0; i < 5; i ++) {
			System.out.println("おはようございます。");
			
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				; // 何もしない
			}
		}
	}
	
	@Override
	public void run() {
		System.out.println("現在のスレッドは" + Thread.currentThread().getName() + "です。");
		for(int i = 0; i < 5; i ++) {
			System.out.println("こんにちは。");
			
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				; // 何もしない
			}
		}
	}
}

実行結果の例は以下の通り。

現在のスレッドはmainです。
おはようございます。
現在のスレッドはThread-0です。
こんにちは。
こんにちは。
おはようございます。
こんにちは。
おはようございます。
こんにちは。
おはようございます。
こんにちは。
おはようございます。
現在のスレッドはmainです。
おはようございます。
現在のスレッドはThread-0です。
こんにちは。
こんにちは。
おはようございます。
こんにちは。
おはようございます。
おはようございます。
こんにちは。
おはようございます。
こんにちは。

この場合にも「おはようございます」と「こんにちは」が入り乱れて表示されていることが分かります。

最終更新: 2014/08/01 , 公開: 2013/03/05
▲top