Akira's Blog

神奈川在住のITエンジニアの雑記です。主にプログラミング(Perl, Java など)やネットワーク技術についての小ネタを、ちょっとずつ書いていきます。

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();

と書く必要がある。