スレッドの作成方法として、前回の記事では
Threadクラスを利用したやり方を記述しました。
今回の記事ではThreadクラスを利用するのとは別の方法でマルチスレッドを実現する方法を記述します。
Threadクラスを利用することで新しいスレッドが作成でき、
マルチスレッドのしくみを実現できるようになります。
しかし、Threadクラスを利用したやり方には、注意しなければならない点があります。
Threadクラスを使おうとするクラスは、Threadクラスを継承しなければなりません。
ここで、注目してほしいのはJavaのルールとして、
『
Javaでは多重継承はできない』
という制約があります。
つまり、一つのクラスに対して、2つ以上のクラスを継承することができないのです。
例えば下記サンプルのようなコードをコンパイルした場合、Javaはエラーを返します。
class Sample extends Applet, Thread{
………
}
上記サンプルはSampleクラスにAppletクラスとThreadクラスを継承しようとしています。
Javaアプレットを作成する場合、Appletクラスを継承する必要があります。
つまり、Threadクラスを継承することが必然的にできないのです。
このようなとき、Javaクラスライブラリの
Runnableインターフェイスを使うことでその問題を解決することができます。
class Sample extends Applet implements Runnable{
………
}
Runnableインターフェイスを実装することで、Threadクラスを継承することなく、マルチスレッドのしくみを作ることができるのです。
下記にRunnableインターフェイスを使ったサンプルを書いてみます。
public class CarRun implements Runnable{
private String carName;
public CarRun(String carName){
this.carName = carName;
}
public static void main(String[] args){
CarRun car1 = new CarRun("インサイト");
CarRun car2 = new CarRun("プリウス");
Thread th1 = new Thread(car1);
Thread th2 = new Thread(car2);
th1.start();
th2.start();
}
public void run(){
for(int i = 0; i < 5; i++){
try{
Thread.sleep(1000);
}catch(Exception e){}
System.out.println(carName + " : " + i + "回目の処理です。");
}
}
}
【実行結果】
インサイト : 0回目の処理です。
プリウス : 0回目の処理です。
プリウス : 1回目の処理です。
インサイト : 1回目の処理です。
インサイト : 2回目の処理です。
プリウス : 2回目の処理です。
プリウス : 3回目の処理です。
インサイト : 3回目の処理です。
プリウス : 4回目の処理です。
インサイト : 4回目の処理です。
上記サンプルは
Threadクラスのサンプルとほぼ同じ内容です。
違うのは、Runnableインターフェイスを使ってスレッドを作成している点だけです。
Runnableインターフェイスを実装したクラスでも、Threadクラスを継承したクラスと同じで、run()メソッドを定義し、この中に新しいスレッドで行う処理を記述します。
ただし、スレッドを起動させる方法が若干違ってきます。
CarRun car1 = new CarRun("インサイト");
CarRun car2 = new CarRun("プリウス");
Thread th1 = new Thread(car1);
Thread th2 = new Thread(car2);
th1.start();
th2.start();
スレッドを起動させるstart()メソッドの実行方法が異なっていることに着目してください。
Runnableインターフェイスを実装したやり方の場合、Threadクラスのオブジェクトを作成する作業が必要になります。
Threadオブジェクトを作成するとき、Runnableインターフェイスを実装したクラスのインスタンスを渡します。
その次に、Threadオブジェクトからstart()メソッドを呼び出せば、新しいスレッドが起動します。
※クラスとオブジェクトの違い
クラスはオブジェクトの型(オブジェクトの特徴をひとくくりにしたもの)を意味します。