技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

Javaでスレッドを作成する時の注意点

まず、Javaでスレッドを作成する基本的な方法は、以下の2つである。

  • Threadクラスを継承したクラスのオブジェクトを生成して、そのオブジェクトのstart()メソッドを実行する。
  • Runnableインタフェースを実装したクラスのオブジェクトを生成し、それを引数としてThreadクラスのオブジェクトを生成し、そのThreadクラスのオブジェクトのstart()メソッドを実行する。

後者の方法では、Threadクラスのオブジェクトを生成して、それ経由で実施したい処理のスレッドを実行する必要がある。そうしないで、Runnableインタフェースを実装したクラスのオブジェクトのrun()メソッドを直接呼び出してしまうと、マルチスレッド(並行処理)にならない。

つまり、以下のように書いてしまうと、並行処理にならない。
# r1 の処理が全部終わってから、r2 が実行されてしまう。

public class ThreadTest {
  public static void main(String[] args) {
    System.out.println("Start!");
    
    Runnable r1 = new Runnable() {
      public void run() {
        try {
          for (int i=0; i<100; i++) {
            System.out.println("Runnable1" + ": " + i);
            Thread.sleep(100);
          }
        } catch (Exception ex){
          System.out.println(ex.getStackTrace());
        }
      }
    };
      
    Runnable r2 = new Runnable() {
      public void run() {
        try {
          for (int i=0; i<100; i++) {
            System.out.println("Runnable2" + ": " + i);
            Thread.sleep(100);
          }
        } catch (InterruptedException ex) {
          System.out.println(ex.getStackTrace());
        }
      }
    };

    //-----------------------------------------------
    // After r1 finished completely, r2 is executed.
    //-----------------------------------------------
    r1.run();
    r2.run();
  }
}


並行処理にしたいならば、

r1.run();
r2.run();

の箇所を、上述の方法に従って、

Thread thr1 = new Thread(r1);
Thread thr2 = new Thread(r2);
thr1.start();
thr2.start();

と書く必要がある。