Java マルチスレッドのサンプル(ThreadとRunnable)

Javaのマルチスレッドのサンプルです。
ThreadクラスまたはRunnableインターフェースを使用します。

目次

マルチスレッド

  • 複数のスレッドが並行で処理されることです。
  • Threadクラスを継承する、またはRunnableインターフェースを実装します。
  • 上から順に1つのスレッドで処理するのはシングルスレッドです。

Threadクラス

コード

3行目は、Threadクラスを継承しています。
10行目は、Threadクラスのrunメソッドのオーバーライドしています。
24-26行目は、それぞれクラスをインスタンス化しています。
29-31行目は、startメソッドでスレッドの実行を開始しています。runメソッドが呼び出されます。

package test1;

class Sample extends Thread{
	private String message;
	
	Sample(String msg){
		this.message = msg;
	}
	@Override
	public void run(){
		for (int i = 0;i<3;i++){
			System.out.println(message);
		}
	}
}
class Sample2 {
	void runSample(){
		System.out.println("テスト");
	}
}
public class Test1 {
	public static void main(String[] args) {

		Sample s1 = new Sample("こんにちは");
		Sample s2 = new Sample("Hello");
		Sample s3 = new Sample("Guten Tag");
		Sample2 s = new Sample2();

		s1.start();
		s2.start();
		s3.start();
		s.runSample();
 	}
}

結果

1.マルチスレッドで動くため何回か実行すると出力される順番が変わります。
下図の左列が1回目の実行時の結果で、右列が2回めの実行時の結果です。

thread1

2.デバッグモードで実行中のスレッドを確認したところです。
mainスレッドの他に作成した3つのスレッドがあります。

thread2

Runnableインターフェース

  • メインスレッドとは別に新規のスレッドが作成されます
  • Runnableインターフェースを実装したクラスはrunメソッドをオーバーライドする必要があります
  • 挙動はThreadクラスと同じです
  • 以下はJava8 API仕様のRunnableインターフェースのリンクです。
    https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Runnable.html

コード

3行目は、Runnableインターフェースを実装しています。
10行目は、Runnableインターフェースのrunメソッドのオーバーライドしています。
24-26行目は、それぞれクラスをインスタンス化しています。
29-31行目は、startメソッドでスレッドの実行を開始しています。runメソッドが呼び出されます。

package test1;

class Sample implements Runnable{
	private String message;
	
	Sample(String msg){
		this.message = msg;
	}
	@Override
	public void run(){
		for (int i = 0;i<3;i++){
			System.out.println(message);
		}
	}
}
class Sample2 {
	void runSample(){
		System.out.println("テスト");
	}
}
public class Test1 {
	public static void main(String[] args) {

		Sample s1 = new Sample("こんにちは");
		Sample s2 = new Sample("Hello");
		Sample s3 = new Sample("Guten Tag");
		Sample2 s = new Sample2();		

		new Thread(s1).start();
		new Thread(s2).start();
		new Thread(s3).start();
		s.runSample();//テスト
 	}
}

joinメソッド

joinメソッドを使用すると指定したスレッドの終了を待つことができます。

上記2つのコードとも、メインスレッドが最初に終了していました。
以下のコードでは、14-16行目にjoinメソッドを使用しています。そのためメインスレッドが最後に終了します。

public class Test1 {
	public static void main(String[] args) {

		Sample s1 = new Sample("こんにちは");
		Sample s2 = new Sample("Hello");
		Sample s3 = new Sample("Guten Tag");
		Sample2 s = new Sample2();

		s1.start();
		s2.start();
		s3.start();
		
		try {
			s1.join();
			s2.join();
			s3.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		s.runSample();
 	}
}

 

△上に戻る