場合によっては、指定した時点で実行中のスレッドを中断する必要があります。たとえば、1 分ごとにセンサーのステータスをチェックするスレッドは、残りの時間は何もする必要がありません。この間、スレッドはコンピュータのリソースを使用する必要がありません。この期間が経過した後、Java 仮想マシンがスレッドをスケジュールすると、スレッドは実行を続けます。これを行うには、Thread クラスの sleep() メソッドを使用できます。このメソッドはスリープさせることでスレッドの実行を遅延させ、整数型パラメータでスリープするミリ秒数を指定します。 sleep() メソッドが呼び出され、スリープ時間が終了すると、Java 仮想マシンは CPU 実行時間をスレッドに割り当て、スレッドは実行を継続します。
sleep() メソッドを使用する別の方法は、列挙型 TimeUnit の要素を使用することです。このメソッドは、Thread の sleep() メソッドを使用して、現在のスレッドをスリープ状態にします。指定された時間単位をパラメータとして受け入れ、対応するミリ秒数に変換できます。
このセクションでは、sleep() メソッドを使用して現在時刻を毎秒出力するプログラムを開発します。
それを知っています
このセクションの例を実装するには、以下に示す手順に従ってください。
1. FileClock という名前のクラスを作成し、Runnable インターフェイスを実装します。コードは次のとおりです。
次のようにコードをコピーします。
パブリック クラス FileClock は Runnable {を実装します
2. run() メソッドを実装します。コードは次のとおりです。
次のようにコードをコピーします。
@オーバーライド
public void run() {
3. 各反復で 10 回実行するループを作成し、Date オブジェクトを作成してコンソールに出力します。次に、TimeUtil の SECONDS プロパティを介して sleep() メソッドを呼び出し、スレッドの実行を 1 秒遅らせます。 sleep() メソッドが InterruptedException をスローすると思っていました。したがって、例外をキャッチするにはさらに数行のコードを記述する必要があります。スレッドが中断される可能性がある場合は、スレッドで使用されているリソースを解放または閉じることが常にベスト プラクティスです。コードは次のとおりです。
次のようにコードをコピーします。
for (int i = 0; i < 10; i++) {
System.out.printf("%s/n", new Date());
試す {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.printf("ファイルクロックが中断されました。/n");
}
}
4. すでに適切に実装されたスレッド クラスがあります。それでは、メインクラスを実装してみましょう。 FileMain という名前のクラスを作成し、main() メソッドを実装します。コードは次のとおりです。
次のようにコードをコピーします。
パブリック クラス FileMain {
public static void main(String[] args) {
5. FileClock オブジェクトを作成し、タスクを実行するスレッドを作成します。次に、スレッドを開始します。コードは次のとおりです。
次のようにコードをコピーします。
FileClock クロック = new FileClock();
スレッド thread = 新しいスレッド(クロック);
thread.start();
6. メイン スレッドで、TimeUtil の SECONDS プロパティを介して sleep() メソッドを呼び出し、5 秒間待機します。コードは次のとおりです。
次のようにコードをコピーします。
試す {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
7. FileClock スレッドを中断します。コードは次のとおりです。
次のようにコードをコピーします。
thread.interrupt();
8. 例を実行し、実行効果を確認します。
理由を知っています
このプログラムを実行すると、プログラムが日付オブジェクトを毎秒出力する方法と、スレッドがどのように中断されるかがわかります。
sleep() メソッドが呼び出されると、スレッドは CPU から離れ、一定期間実行を停止します。この間、スレッドは CPU を必要としないため、CPU は他のタスクを実行できます。
スリープ中のスレッドが中断されると、スリープが終了するまで待たずに、直ちに InterruptedException がスローされます。
終わりのない
Java 同時実行 API には、スレッドが CPU を放棄できるようにする別の方法があります。これは yield() メソッドです。このメソッドを呼び出すと、スレッドが他のスレッドに CPU を譲渡できることを示すメッセージが Java 仮想マシンに送信されます。 Java 仮想マシンは、このリクエストに応答することを保証しません。通常、このメソッドはプログラムをデバッグする場合にのみ使用されます。
ドクトリンを使用する
この記事は「Java 7 Concurrency Cookbook」(D Gua Ge が「Java7 Concurrency Example Collection」として盗用しました) を翻訳したものであり、学習教材としてのみ使用されます。許可なく商業目的で使用することはできません。
小さな成功
このセクションで使用されるサンプル コードの完全版。
FileClock クラスの完全なコードは次のとおりです。
パッケージ com.diguage.books.concurrencycookbook.chapter1.recipe5;
java.util.Dateをインポートします。
java.util.concurrent.TimeUnitをインポートします。
/**
* 現在の日付と時刻を毎秒コンソールに出力します。
* 日付: 2013-09-18
* 時間: 23:11
*/
パブリック クラス FileClock は Runnable {を実装します
@オーバーライド
public void run() {
for (int i = 0; i < 10; i++) {
System.out.printf("%s/n", new Date());
試す {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.printf("ファイルクロックが中断されました。/n");
}
}
}
FileMain クラスの完全なコード
次のようにコードをコピーします。
パッケージ com.diguage.books.concurrencycookbook.chapter1.recipe5;
java.util.concurrent.TimeUnitをインポートします。
/**
* デモスレッドのスリープと再開
* 日付: 2013-09-19
* 時間: 00:29
*/
パブリック クラス FileMain {
public static void main(String[] args) {
FileClock クロック = new FileClock();
スレッド thread = 新しいスレッド(クロック);
thread.start();
試す {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt();
}
}