Javaプログラミング スレッドの生成と停止¶
スレッドに関するAPI¶
Javaには、スレッドに関して大きく2つのAPIが存在します。
1つは、初期のバージョンから提供されている java.lang.Thread クラスとその関連クラス・インタフェースです。
もう1つは、Java SE 5.0 (JDK 1.5) で導入された java.util.concurrentパッケージです。
ここでは、2つ目の java.util.concurrentパッケージを中心に、一部分 Thread クラスを扱います。
スレッドの生成¶
実行しっぱなしのスレッドを生成¶
スレッドを生成して実行したあとは、そのスレッドから結果を回収するとか、スレッドを停止するといった操作がない場合の例です。
Runnableインタフェースを実装した処理を記述し、スレッドに処理を渡して実行します。
java.lang.Threadを使用¶
var process = () -> {
// スレッドで実行する処理
}
var thread = new Thread(process).start();
java.util.concurrentのサービスを使用¶
var process = () -> {
// スレッドで実行する処理
}
Executors.newSingleThreadExecutor().submit(process);
実行した後、停止を可能とするスレッドを生成¶
スレッドを生成して実行したと、そのスレッドを停止する操作を行う例です。
java.lang.Threadのstopメソッドは非推奨¶
java.lang.Threadクラスのstopメソッドは非推奨となりました。他の方法を使います。
インタラプション¶
スレッドにインタラプションを行い、スレッドの中でインタラプションの対応を記述します。
var process = () -> {
try {
while (!Thread.currentThread().isInterrupted()) {
// スレッドで実行する処理。一定時間で終了し、whileループの条件チェックが実行されること
}
} catch (InterruptedException ex) { // スレッドの処理でインタラプション対応のブロックするメソッドを呼び出しているとき
//
}
};
var thread = new Thread(process).start(); // スレッドの生成と実行
:
thread.interrupt(); // スレッドへインタラプション
スレッドのinterruptメソッドを呼ぶと、そのスレッドはインタラプションされたとマークされます。
スレッドの処理の中で、スレッドのisInterruptedメソッドでインタラプションされたマークがあるかどうかチェックします。
インタラプションされたマークがあると、スレッドの処理を打ち切ります(上述の例では)。
インタラプションに対応したブロックするメソッド(例、Thread.sleep)は、ブロックの途中でスレッドにインタラプションがマークされるとInterruptedExceptionをスローします。
タスクのキャンセル(Future)¶
java.util.concurrentパッケージのFutureを使ってスレッドを停止します。
var executor = Executors.newSingleThreadExecutor();
var process = () -> {
try {
// スレッドの処理
} catch (InterruptedException ex) {
// スレッドの中断処理
} finally {
executor.shutdown();
}
};
Future<?> future = executor.submit(process);
:
future.cancel(true);
ExecutorServiceのsubmitメソッドで実行した処理は、submitメソッドの戻り値のFutureのcancelを呼び出すことで中断することができます。
cancelメソッドの引数は、タスクが実行中であればインタラプトするかどうかの指定です。タスクがインタラプトに対応していれば true を指定、そうでなければ false を指定します。