シリーズ一覧
[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か所です。
- Runnableインターフェイスを実装するクラスを宣言
- runメソッドをオーバーライドして実行したい命令を追加する
- 1のオブジェクトを引数にして、Threadクラスのインスタンスを生成
- 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オブジェクトを作る。
コメント