2. スレッドの実行
- 2.1. Threadクラスを継承する方法
- 2.2. Runnableインタフェースを実装する方法
- 2.3. 2つのスレッド作成方法の比較
プログラムの中でスレッドを作成する方法は2つあります。ひとつはjava.lang.Threadクラスを継承(extends)したクラスを作成する方法です。もうひとつはjava.lang.Runnableインタフェースを実装(implements)したクラスを作成する方法です。この章では、それぞれの方法について説明します。
2.1. Threadクラスを継承する方法
Threadクラスを継承したクラスを利用して新しいスレッドを実行するには、次のような手順を用います。
- Threadクラスを継承するクラスを作成する。
- そのクラスでrunメソッドを宣言する。
- そのクラスのインスタンスを作成する。
- そのインスタンスのstartメソッドを呼び出す。
この方法を用いたプログラムを見てみましょう。次のプログラムは、3から0まで数字をカウントダウンする処理を2つのスレッドで同時に実行するプログラムです。
リスト CountDownThread.java
class CountDownThread extends Thread { private String name; public CountDownThread(String name) { this.name = name; } public void run() { for (int i = 3; i >= 0 ; i--) { try { sleep(1000); } catch (InterruptedException e) {} System.out.println(name + " : " + i); } } public static void main(String[] args) { CountDownThread t1 = new CountDownThread("thread 1"); CountDownThread t2 = new CountDownThread("thread 2"); t1.start(); t2.start(); } }
1行目のクラス宣言を見ると、このクラスがThreadクラスを継承していることがわかります。
runメソッドには、新しいスレッドで実行させたい処理を記述します。ここではforループを用いてカウントダウン処理を行っています。なお、runメソッド内で使用しているsleepメソッドは、Threadクラスのstaticメソッドです。sleepメソッドは、現在実行中のスレッドを指定した時間だけ休止させる機能を持ちます。ここでは1回カウントするたびに1000ミリ秒(=1秒)待つように指定しています。
スレッドを利用するためには、スレッドのインスタンスを作成します。19〜20行目で2つのインスタンスを異なる名前で作成しています。
CountDownThread t1 = new CountDownThread("thread 1"); CountDownThread t2 = new CountDownThread("thread 2");
最後に、21〜22行目でstartメソッドを呼ぶことによりスレッドを起動しています。ここで、runメソッドではなく、startメソッドを呼んでいることに注意してください。runメソッドを呼んでもrunメソッドに記述した処理は実行されますが、通常のメソッド呼び出しと同じで、新しいスレッドは起動されません。startメソッドを呼ぶことによって、新しいスレッドが起動され、その新しいスレッドによってrunメソッドが実行されるのです
このプログラムを実行すると次のよう表示されます。作成した2つのスレッドが並行して動作しているのがわかります。
(実習課題1)
以下のプログラムを作成しなさい。
- スレッドの動作スピードを競うコンソールプログラム。実装するスレッドは以下の2つ。
- 与えられたint型の配列を選択ソートするスレッド。
- 与えられたint型の配列をバブルソートするスレッド。
- 2つのスレッドに与えられれるint型の配列は同じものとする。ただし必ずそれぞれのスレッドに対して1つずつ配列を作成する事。配列のサイズと中身のデータは任意とする。