まず、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();
と書く必要がある。