new Thread() / スレッド.start() / Runnable
| 対応: | Java 1.0(1996) |
|---|
スレッドを使うと複数の処理を並行して実行できます。『Thread』クラスを継承するか、『Runnable』インターフェースを実装してスレッドを作成し、『start()』で起動します。
構文
// Runnableをラムダ式で渡す方法(推奨)
Thread t = new Thread(() -> {
// スレッドで実行する処理
});
t.start();
// Runnableインターフェースを実装する方法です
class MyTask implements Runnable {
@Override
public void run() {
// スレッドで実行する処理
}
}
Thread t = new Thread(new MyTask());
t.start();
// Threadクラスを継承する方法です
class MyThread extends Thread {
@Override
public void run() {
// スレッドで実行する処理
}
}
new MyThread().start();
// 指定ミリ秒だけスレッドを一時停止します(InterruptedExceptionに注意)
Thread.sleep(1000);
// スレッドが終了するまで待機します
t.join();
主なメソッド一覧
| メソッド | 概要 |
|---|---|
| start() | スレッドを新しく起動します。内部で run() が新スレッド上で実行されます。 |
| run() | スレッドで実行される処理を記述します。直接呼ぶと同じスレッド上で実行されます。 |
| Thread.sleep(long millis) | 現在のスレッドを指定ミリ秒だけ一時停止します。チェック例外 InterruptedException の処理が必要です。 |
| join() | このスレッドが終了するまで呼び出し元スレッドを待機させます。 |
| Thread.currentThread() | 現在実行中のスレッドを返します。 |
| getName() / setName() | スレッドの名前を取得・設定します。デバッグに便利です。 |
| isAlive() | スレッドが実行中かどうかを返します。 |
| interrupt() | スレッドに割り込みを要求します。スレッドが sleep() などで待機中なら InterruptedException が発生します。『InterruptedException』は他のスレッドから中断を要求された際にスローされます。キャッチした場合は『Thread.currentThread().interrupt()』で中断状態を復元するのが推奨されます。 |
サンプルコード
sample_ThreadRunnable.java
class Counter implements Runnable {
private int count;
@Override
public void run() {
for (int i = 0; i < 5; i++) count++;
System.out.println("カウント: " + count);
}
}
class ThreadRunnable {
public static void main(String[] args) throws InterruptedException {
// ラムダ式でスレッドを作成して起動します
Thread t1 = new Thread(() -> {
for (int i = 1; i <= 3; i++) {
System.out.println("スレッドA: " + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}, "スレッドA");
Thread t2 = new Thread(() -> {
for (int i = 1; i <= 3; i++) {
System.out.println("スレッドB: " + i);
}
}, "スレッドB");
t1.start();
t2.start();
// join() でスレッドの終了を待ってから次の処理を行います
t1.join();
t2.join();
System.out.println("両スレッドが終了しました。");
// Runnableをクラスで実装します
new Thread(new Counter()).start();
}
}
ThreadRunnable.java
javac ThreadRunnable.java java ThreadRunnable スレッドB: 1 スレッドB: 2 スレッドB: 3 スレッドA: 1 スレッドA: 2 スレッドA: 3 両スレッドが終了しました。 カウント: 5
※ スレッドの実行順序は実行環境によって変わります。
概要
スレッドを使うと時間のかかるIO処理やCPU処理を並行して実行でき、プログラムの応答性を向上させることができます。複数のスレッドが同じデータを読み書きする場合は競合状態(race condition)が発生するため、synchronized キーワードや java.util.concurrent パッケージのクラスを使って排他制御を行ってください。
実際のアプリケーションでは Thread を直接作成するより、スレッドプールを管理する『ExecutorService』を使うことが推奨されます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。