Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
new Thread() / スレッド.start() / Runnable
スレッドを使うと複数の処理を並行して実行できます。『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 が発生します。 |
サンプルコード
// ラムダ式でスレッドを作成して起動します。
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() でスレッドの終了を待ってから次の処理を行います。
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("両スレッドが終了しました。");
// Runnableをクラスで実装します。
class Counter implements Runnable {
private int count;
@Override
public void run() {
for (int i = 0; i < 5; i++) count++;
System.out.println("カウント: " + count);
}
}
new Thread(new Counter()).start();
概要
スレッドを使うと時間のかかるIO処理やCPU処理を並行して実行でき、プログラムの応答性を向上させることができます。複数のスレッドが同じデータを読み書きする場合は競合状態(race condition)が発生するため、synchronized キーワードや java.util.concurrent パッケージのクラスを使って排他制御を行ってください。
実際のアプリケーションでは Thread を直接作成するより、スレッドプールを管理する『ExecutorService』を使うことが推奨されます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。