[ Java Gold 対策 ] はじめてのスレッド 3日目 : スレッドの作り方2

シリーズ一覧
[Java Gold対策] はじめてのスレッド 1日目 : スレッドとは?
[Java Gold対策] はじめてのスレッド 2日目 : スレッドの作り方
[Java Gold対策] はじめてのスレッド 3日目 : スレッドの作り方2
[Java Gold対策] はじめてのスレッド <よりみち1> : 匿名クラスで書く。
[Java Gold対策] はじめてのスレッド <よりみち2> : ラムダ式で書く。
[Java Gold対策] はじめてのスレッド 4日目 : スレッドをsleepさせよう
[Java Gold対策] はじめてのスレッド 5日目 : joinメソッドで順番待ち
[Java Gold対策] はじめてのスレッド 6日目 : runメソッドで条件付き停止

目次

スレッドの2種類の作り方 (復習)

Java Gold 対策 第2回では、スレッドの作り方の種類と、Threadクラスの拡張での方法を説明しました。

  • Threadクラスを継承した新しいクラスを作る
  • Runnableインターフェイスを実装した新しいクラスを作る

では、今回は「2」のRunnableインターフェイスを実装する方法を見ていきましょう!

Runnableインターフェイスを実装する

実行したい処理を含めたスレッドの作り方

ほとんどが前回やったThreadクラスを拡張する方法と同じです。
変わったのは2か所です。

  1. Runnableインターフェイスを実装するクラスを宣言
  2. runメソッドをオーバーライドして実行したい命令を追加する
  3. 1のオブジェクトを引数にして、Threadクラスのインスタンスを生成
  4. 3からstartメソッドを呼び出す 

Threadクラスのコンストラクタは、引数なしのもの(前回使ったもの)と、引数ありのもの(今回使うもの)とで、オーバーロードされています。
今回のパターンでは、Runnableインターフェイスを実装したインスタンスから始めますが、結局前回同様にThreadクラスのインスタンスを生成して、そのstartメソッドを呼び出すのです。

具体的に見てみる

実際にコードを見ていきましょう!
SampleThread2というクラスを宣言し、マルチスレッドで処理を行うプログラムです。

実際の処理内容は、前回とほぼ変わりません。
(前回の繰り返しは100回でコンソールが大変なことになったので、今回は10回にしております汗)

// Runnableインターフェイスを実装
class SampleThread2 <strong><span class="swl-marker mark_yellow">implements Runnable</span></strong> {		
	// runメソッドをオーバーライド
	public void <strong><span class="swl-marker mark_yellow">run()</span></strong> {		
		// 実際に実行したい命令:runメソッド内で出力を10回繰り返す
		for(int i = 0; i < 10; i++) {
			System.out.println("SampleThread2のrunメソッド(" + i + ")");
		}
	}
}

public class SampleThreadMain2 {
	public static void main(String[] args) {
		SampleThread2 t = new SampleThread2();
		// SimpleThread2オブジェクトを引数にしてThreadオブジェクトを生成
		Thread thread = <span class="swl-marker mark_green"><strong>new Thread(t)</strong></span>;
		// スレッドを開始する
		<span class="swl-marker mark_green">thread.start()</span>;
		
		// 実際に実行したい命令:mainメソッド内で出力を10回繰り返す
		for (int i = 0; i < 10; i++) {
			System.out.println("SampleThreadMain2のmainメソッド(" + i + ")");
		}
	}
}

やりたいことは、前回とほぼ変わりません。
Mainクラスのmainメソッドから、まずはSampleThread2オブジェクトを生成します。
それを今度はThreadクラスのコンストラクタに渡して、スレッドを開始しています。

今回、実際に処理したい内容を書き込むrunメソッドは、SampleThread2にあります
Threadクラスに書くのではないので注意してくださいね。
このようにRunnableインターフェイスを使う場合、ThreadクラスはノータッチでOKです。

結果として、Mainクラスのmainスレッドと、SampleThread2クラスのrunスレッドの、2つのスレッドが走ります。

実行結果: 2つのスレッドが同時に実行されます。

// 略 //
SampleThread2のrunメソッド(0)
SampleThreadMain2のmainメソッド(5)
SampleThreadMain2のmainメソッド(6)
SampleThreadMain2のmainメソッド(7)
SampleThread2のrunメソッド(1)
SampleThreadMain2のmainメソッド(8)
SampleThread2のrunメソッド(2)
SampleThreadMain2のmainメソッド(9)
SampleThread2のrunメソッド(3)
SampleThread2のrunメソッド(4)
// 略 //

今回は繰り返し回数を少なくしたので、試行回数が少ないと順番に処理されたようになってしまうかもしれません。
その場合は、何回か実行してあげてください。毎回結果が変わるはずです

次回予告:もっと便利につかいたい!

今回はRunnableインターフェイスの使い方を見ていきました。これで、継承をつかってスレッドを量産することもお手の物ですね

でも、作りたいアプリケーションはこれで作れるでしょうか?

今のままでは、2つのスレッドを作ったは良いもの、スレッドの順番やタイミングなどはなにも指定することができません。
ぜ~んぶ、JVMやCPU任せです。

でも、大丈夫です!
そんなときのために、スレッドを止めたり、一時停止したり、順番を指定したりできるメソッドが用意されています!

次回は、そんな便利な仲間たちを紹介しますので、お楽しみに!

今日のキーワード

  • Runnableインターフェイス 
    :java.langパッケージ内のインターフェイス。runメソッドが定義されている。
     このオブジェクトをThreadクラスのコンストラクタに渡して、Threadオブジェクトを作る。
(Visited 96 times, 1 visits today)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社NEUGATEは、都内で企業研修や職業訓練を運営している会社です。主に、IT系の教育事業に力を入れています。
この記事は、株式会社NEUGATEの教育事業部が執筆をしています。

企業ホームページ:https://neugate.co.jp/

コメント

コメントする

目次