今更ながら、Javaのスレッドのコーディングをする機会があり、基本の「キ」から思い出すべく、ここにメモをします。
検索で来た方への参考にもなればいいな。
そもそもJavaのスレッドってなんだっけ?
結論から言うと、並列処理のことです。 普通のプログラムを書いても直列(つまり作業者1人)ですが、スレッドを用いることで、作業者を2人にも3人にも増やして並行作業ができるようになります。
リソースを効率的に活用できるのでプログラムを高速化することができますが、一方でデータの取扱に注意しないと思った通りプログラムが動作せず、バグの原因となります。
Javaのスレッドの作り方は2つ
Javaのスレッドの作り方は2つあります。
- スレッドを継承したクラスを作る
- Runnableインターフェースを実装する
この記事では、「スレッドを継承したクラスを作る」方法を解説します。
Runnableインターフェースの方は、別記事で書いています。
スレッドのサブクラスを作る方法
スレッドクラスを継承(extends)したクラスを作って、それをmainメソッドから呼び出す感じです。
サンプルコード「ThreadCall(呼び出し元)」と「ThreadRun(呼び出されるスレッド)」の2つを作りました。
並行処理の流れがわかると思います。
ThreadRun(呼び出されるスレッド)
スレッドを継承する(extends Thread)クラス、ThreadRunを作成します。
コメントの通り、100回カウントするだけのプログラムです。
1回カウントすると、0.1秒(=1000msec)待ちます。
public class ThreadRun extends Thread{ public void run(){ // iが100になるまでカウントを繰り返す for(int i=0; i<100; i++){ //カウントを出力 System.out.println("Thread Count:" + i); // スリープ0.1秒待つ try { // 参考:ThreadRunクラスは、 // Threadクラスを継承(extends)しているので、 // Thread.sleep();でなく、sleep();のみでOK。 sleep(1000); } catch (InterruptedException e){ e.printStackTrace(); } } } }
ThreadCall(呼び出し元)
「ThreadRun」クラスをインスタンス化して、start()してあげると、スレッドが動き出します。
平行処理しているのがわかりやすいように、このmainメソッドでも0.1秒待って100までカウントする処理を入れています。
public class ThreadCall { public static void main(String[] args){ // ThreadRunクラスをインスタンス化 ThreadRun t = new ThreadRun(); // ThreadRunクラスのインスタンス t をstart()して、スレッド開始 t.start(); // iが100になるまでカウントを繰り返す for(int i=0; i<100; i++){ //カウントを出力 System.out.println("Main Count:" + i); try{ // スリープ0.1秒待つ Thread.sleep(1000); }catch (InterruptedException e){ e.printStackTrace(); } } } }
実行してみるとこんな感じ
さて、早速mainメソッドのある「ThreadCall.java」を実行してみましょう。
下の画面のように、「Main」と「Thread」が交互に出力されていますね。
並行処理になっているのがわかると思います。
結構カンタンに実装できるでしょ?
このプログラムを元に、改良していくとカンタンですよ。
他に、Runnableインターフェースを実装する方法もあります。
ExecutorServiceを使って、複数スレッドを作成する方法はこちらの記事です。