alphaのjava備忘録

alphaが勉強したことを書いていくブログ

スレッド(Thread)を使うには

Javaには並列処理を行う仕組み(スレッド)について学ぶ。もののネットによると、スレッドを活用することで並列処理が可能になり多量の同一処理が早く行えたり、別個の処理を同時に動かしたり、処理実行中に入力を受け付けたりできるらしい。今一つよく分かっていないが習うより慣れろだ。


Javaでスレッドを使用する方法には
 ・extendsを使う
 ・implementsを使う
の2種類がある。今回は簡単そうなExtendsの方を実践してみる。


記述方法としては単純で下記の通り。
(1) スレッドとして並列処理で動かすクラスを作成する
(2) (1)のクラスにThreadクラスを継承 (extends) する
(3) (1)のクラスのrun()メソッド内に並列処理で動かしたい処理を記述する
(4) スレッドを使用するクラスで(1)のクラスをインスタンス
で、動かしてみる。

public class Main {
    public static void main(String[] args) {
        Thread2 th2 = new Thread2();
        System.out.println("Thread 1 moved.");
    } 
}
 
class Thread2 extends Thread {
    public void run() {
    System.out.println("Thread 2 moved.");
    }
}
実行結果
Thread 1 moved.

あれ?おかしいぞ。スレッド2が動かない。
もう一度ネットで調べてみたらスレッドを動かすにはスレッドのクラスをインスタンス化するだけでなく、インスタンスをstart()メソッドで動かす必要があるみたい。うっかりミスだ。。。

書き直し。

public class Main {
    public static void main(String[] args) {
        Thread2 th2 = new Thread2();
        th2.start();                                           /ここを追加/
        System.out.println("Thread 1 moved.");
    } 
}
 
class Thread2 extends Thread {
    public void run() {
    System.out.println("Thread 2 moved.");
    }
}

で実行する。

実行結果
Thread 1 moved.
Thread 2 moved.


よし。スレッドが2つ動いたのが確認できた。ところで各スレッドは独立して動作するために、終了順は約束されないらしい。今回の処理でもソースコード上では"Thread 2 moved." が ”Thread 1 moved.” よりも早く処理されるはずなのに、実行結果の順番は"Thread 1 moved." が先になっている。処理終了を同期する必要がある時は別途スレッド関係のメソッドを使う必要があるようだ。