21. Threadクラス

Thread クラスのサブクラスにする方法です。

(1) Thread クラスのサブクラスの作成

 マルチスレッドのプログラムの作り方の1つ目は java.lang.Thread クラスのサブクラスを作る方法です。

 Thread クラスには run( ) というメソッドがあります。このメソッド内に書かれている処理はマルチスレッドで実行されます。つまり、同時に動かしたい処理をここに書くということです。

 自分のプログラムを Thread クラスのサブクラスにすると、run( ) メソッドが継承されるので、この run( ) メソッドをオーバーライドします。

class MyThread extends Thread {

    public void run() {
        for (int i=0;i<5;i++) {
            System.out.println(i);
        }
    }

}

 これで、スレッドで動くプログラムができあがりました。


(2) スレッドの実行

 次に、新しくスレッドを作ってプログラムを実行させます。

 スレッドで動く部分は先の MyThread クラス内の run( ) メソッドの中に作ってあります。これをスレッドで動かすには、Thread クラスの start( ) メソッドを呼び出します。start( ) メソッドは継承されているので、
MyThread kick = new MyThread( );
kick.start( );

 のように書くことで、MyThread クラスの run( ) が実行されます。

  ThreadTest.java

class MyThread extends Thread {
    public void run() {
        for (int i=0;i<5;i++) {
            System.out.println(i);
        }
    }
}

class ThreadTest {
    public static void main(String args[]) {
        MyThread kick1 = new MyThread();
        MyThread kick2 = new MyThread();
        kick1.start();
        kick2.start();
    }
}


 実行例

C:\java_test>java ThreadTest
0
0
1
1
2
2
3
3
4
4



(3) スレッドの情報を調べる

 ThreadTest で2つのプログラムが同時に動いているように見えますが、どの出力がどのスレッドで行われているかがわかりません。そこで、Thread クラスのメソッドを使って調べてみます。

static Thread currentThread( )
現在実行中のスレッドを返す。

String getName( )
このスレッドの名前を返す。

 1つ目の currentThread は static メソッドなので、 Thread.currentThread( ) として使います。2つ目のメソッドは Thread オブジェクトに対して使うので、kick1.getName( ) のように使います。

 スレッドには自動的に Thread-0、Thread-1 のように名前が付きます。getName( ) メソッドではこのような名前を返すので、違うスレッドであることが確認できます。

  ThreadTest.java

class MyThread extends Thread {
    public void run() {
        for (int i=0;i<5;i++) {
            Thread t = Thread.currentThread();
            String tName = t.getName();
            System.out.println( tName + ":" + i);
        }
    }
}

class ThreadTest {
    public static void main(String args[]) {
        MyThread kick1 = new MyThread();
        MyThread kick2 = new MyThread();
        kick1.start();
        kick2.start();
    }
}


 実行例

C:\java_test>java ThreadTest
Thread-0:0
Thread-1:0
Thread-0:1
Thread-1:1
Thread-0:2
Thread-1:2
Thread-0:3
Thread-1:3
Thread-0:4
Thread-1:4


(4) スレッドの実行休止

 これでもまだ本当に同時に動いているか怪しいと思う方のために、途中で実行の休止を入れながら実行するようにしてみます。スレッドの実行を休止するためのメソッドは
static void sleep(int m_sec) throws InterruptedException

 というメソッドです。例外を投げる可能性があるメソッドなので、try 〜 catch で処理します。sleep( ) メソッドの引数にはミリ秒を指定します。1秒止めたい時は1000とします。

  ThreadTest.java (青色の部分が変更部分です)

class MyThread extends Thread {
    private int delay;

    public MyThread(int d) {
        // 休止時間の設定
        delay = d;
    }

    public void run() {
        for (int i=0;i<5;i++) {
            try { 
                Thread t = Thread.currentThread();
                String tName = t.getName();
                System.out.println( tName + ":" + i);
                Thread.sleep(delay); // 休止
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class ThreadTest {
    public static void main(String args[]) {
        MyThread kick1 = new MyThread(1000);
        MyThread kick2 = new MyThread(2000);
        kick1.start();
        kick2.start();
    }
}


 実行例

C:\java_test>java ThreadTest
Thread-0:0
Thread-1:0
Thread-0:1
Thread-0:2
Thread-1:1
Thread-0:3
Thread-0:4
Thread-1:2
Thread-1:3
Thread-1:4

 表示されるタイミングを見てみると、Thread-0 は1秒おき、Thread-1 は2秒おきに表示されることがわかります。

前の章(20.スレッド)   次の章(22.Runnableインタフェース)