EeBlog(テクニカルブログ)

第2回 マルチスレッドを使う

「マルチスレッド」と聞くと難しいイメージがあります。
しかし、使いこなせれば非常に便利でプログラムの幅も広がります。
そこで今回は、マルチスレッドを使う事を勉強します。 先ずは「どんなときに使うか?」を理解しましょう。
その後、「どうやって使用するか?」を学びます。
マルチスレッドはインターフェイスやインナークラス等と 併用する場合が多いため難しいと思われがちですが、 実際には基本パターンを覚えておくだけでも非常に便利に使えるものです。


先ず、「どんなときに使うか?」ですが、
マルチスレッドが「同時処理の機能」と考えてしまうと難しくなります。
それよりも「待つ必要の無い処理」を考えましょう。
例えば、ショッピングサイトで注文が入った際に
「販売者にお知らせメールを送る」処理について考えます。
メールが送れなかった場合に例外処理は必要になりますが、 この機能が単なるお知らせ機能であり、受注自体には問題が無い機能であれば、 発注時点でメール送信完了を待つ必要はありません。
待つ必要の無い処理を待つことでお客を待たせるのはとても無駄なことです。
同じように、印刷処理や保存処理もメイン機能が処理を待つ必要が無い場合があります。
このように、待つ必要の無い処理を行う際、 マルチスレッドを使うべきです。
メイン処理と別スレッドにすることで、メイン処理は待つ必要なく次に進める からです。

さて次に、「どうやって使用するか?」です。
以下にサンプルを書いておきます。

new Thread(new Runnable() {
     public void run() {
         // 待たなくてもよい処理
     }
}).start();
  • Runnableインターフェイスを実装したクラスを生成。
  • 生成した実装クラスにrunメソッドを定義し、処理を記述。
  • 上記オブジェクトをコンストラクタの引数としてThreadクラスを生成。
  • Threadクラスのstart()メソッドで処理を実行

といった手順になりますが、サンプルはインナークラスを利用し、 一気に実行しています。
上記に具体的な処理を入れると以下のようになります。

public class ThreadTest {
     public static void main(String[] args) {
         System.out.println("メイン処理開始");
         new Thread(new Runnable() {
             public void run() {
                 for (int i = 1; i <= 10; i++) {
                     System.out.println("処理中...." + i);
                     try {
                         Thread.sleep(1000);
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
                 }
             }
         }).start();
         System.out.println("メイン処理終了");
     }
 }

run()メソッド内の処理を待たずにメイン処理が終了する事に注目してください。