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

Javaのマルチスレッドのサンプルです。

目次

サンプル マルチスレッド
  マルチスレッドで実行する(Threadクラス)
  マルチスレッドで実行する(Runnableインターフェース)
  指定したスレッドの終了を待つ(join)

マルチスレッド

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

マルチスレッドで実行する(Threadクラス)

public class Thread extends Object implements Runnable
public void run()

Threadクラスを使用したサンプルです。

package test1;

class Color1 extends Thread{
	private String col;
	Color1(String col){
		this.col = col;
	}
	@Override
	public void run(){
		for (int i = 0;i<2;i++){
			System.out.println(col);
		}
	}
}
class Color2 {
	void display(){
		System.out.println("オレンジ");
	}
}
public class Test1 {
	public static void main(String[] args) {
		Color1 c1 = new Color1("red");
		Color1 c2 = new Color1("yellow");
		Color1 c3 = new Color1("blue");
		Color2 col1 = new Color2();

		c1.start();
		c2.start();
		c3.start();
		col1.display();
 	}
}

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

結果

1.マルチスレッドで動くため何回か実行すると出力される順番が変わります。
以下は1回目の実行です。

以下は2回目の実行です。

 

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

 

マルチスレッドで実行する(Runnableインターフェース)

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

Runnableインターフェースを使用したサンプルです。

package test1;

class Color1 implements Runnable{
	private String col;
	Color1(String col){
		this.col = col;
	}
	@Override
	public void run(){
		for (int i = 0;i<2;i++){
			System.out.println(col);
		}
	}
}
class Color2 {
	void display(){
		System.out.println("オレンジ");
	}
}
public class Test1 {
	public static void main(String[] args) {
		Color1 c1 = new Color1("red");
		Color1 c2 = new Color1("yellow");
		Color1 c3 = new Color1("blue");
		Color2 col1 = new Color2();

		new Thread(c1).start();
		new Thread(c2).start();
		new Thread(c3).start();
		col1.display();
 	}
}

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

指定したスレッドの終了を待つ

public final void join() throws InterruptedException

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

package test1;

class Color1 extends Thread{
	private String col;
	Color1(String col){
		this.col = col;
	}
	@Override
	public void run(){
		for (int i = 0;i<2;i++){
			System.out.println(col);
		}
	}
}
class Color2 {
	void display(){
		System.out.println("オレンジ");
	}
}
public class Test1 {
	public static void main(String[] args) {
		Color1 c1 = new Color1("red");
		Color1 c2 = new Color1("yellow");
		Color1 c3 = new Color1("blue");
		Color2 col1 = new Color2();
		c1.start();
		c2.start();
		c3.start();
		
		try {
			c1.join();
			c2.join();
			c3.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		col1.display();
 	}
}

31~33行目は、joinメソッドです。スレッドの終了を待ちます。
37行目は、31~33行目の処理が終了してから実行されます。

関連の記事

Java サーブレットのセッションのサンプル(getSession)

△上に戻る