ここでは、スレッドの動きを少し詳しくみていきます。
スレッドの実装方法としては、以下の2通りが存在します。
以下の仕様、サンプルコードで具体例を示します。
<<サンプルコード仕様説明>> ・ RacingCarクラス(スレッド処理) 車自身です。 例では、サーキット5周を走行します。 ・ CarRaceクラス 車(RacingCarクラス)の初期設定、及びスタートを行います。 例では、車を3体用意し、各々が別スレッドで処理を行い、順位を競わせます。
Threadクラスを継承する場合には、以下の2点に注目してください。
■サンプルコード
2-1-1. RacingCar.java
class RacingCar extends Thread{ private int number = 0; private static int round = 5; private static String[] printOffset = {"", "\t\t\t", "\t\t\t\t\t\t"}; public RacingCar(int number){ //引数の値(車番)をインスタンス変数に格納 this.number = number; } public void run(){ for (int i = 1; i <= round; i++){ try{ //ランダムミリ秒数スリープにて差を出す Thread.sleep((long)(Math.random() * 1000)); //割込み例外処理 }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(printOffset[number-1] + this.number+"号車 "+i+"周目通過"); } System.out.println(printOffset[number-1] + this.number+"号車 GOAL!!"); } }
2-1-2. CarRace.java
class CarRace{ public static void main(String args[]){ //Threadクラス継承のサブクラスのインスタンスを生成する RacingCar racingCar1 = new RacingCar(1); RacingCar racingCar2 = new RacingCar(2); RacingCar racingCar3 = new RacingCar(3); //生成したスレッドのインスタンスのstartメソッドを呼び出す //(スレッド起動) racingCar1.start(); racingCar2.start(); racingCar3.start(); } }
Runnableインタフェースを実装する場合には以下の2点に注目してください。
■サンプルコード
2-2-1. RacingCar.java
class RacingCar implements Runnable{ private int number = 0; private static int round = 5; private static String[] printOffset = {"", "\t\t\t", "\t\t\t\t\t\t"}; public RacingCar(int number){ //引数の値(車番)をインスタンス変数に格納 this.number = number; } public void run(){ for (int i = 1; i <= round; i++){ try{ //ランダムミリ秒数スリープにて差を出す Thread.sleep((long)(Math.random() * 1000)); //割込み例外処理 }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(printOffset[number-1] + this.number+"号車 "+i+"周目通過"); } System.out.println(printOffset[number-1] + this.number+"号車 GOAL!!"); } }
2-2-2. CarRace.java
class CarRace{ public static void main(String args[]){ //Runnableインタフェース実装のインスタンスを引数に、 //スレッドのインスタンスを生成する Thread racingCar1 = new Thread(new RacingCar(1)); Thread racingCar2 = new Thread(new RacingCar(2)); Thread racingCar3 = new Thread(new RacingCar(3)); //生成したスレッドのインスタンスのstartメソッドを呼び出す //(スレッド起動) racingCar1.start(); racingCar2.start(); racingCar3.start(); } }
■実行結果イメージ
となりましたが、いつもこの順位とは限りません。
※どちらの方法でも、実行結果は同じです。