マルチスレッド Java プログラムでは、すべてのスレッドが実行を完了するまでプログラム全体は終了しません。 (デーモン以外のすべてのスレッドの実行が完了することに注意してください。スレッドが System.exit() メソッドを実行すると、プログラムも終了します。) たとえば、スレッドの実行を中止したい場合があります。プログラムを終了したい場合や、実行中のタスクをキャンセルしたい場合など。
Java は、実行を終了したいスレッドを明示的に中断できる割り込みメカニズムを提供します。割り込みメカニズムの特徴の 1 つは、スレッドが割り込まれたかどうかを確認して、中止要求に応答するかどうかを決定できることです。スレッドは中止要求を無視して実行を継続することもできます。
このセクションでは、開発したサンプル プログラムはスレッドを作成し、5 秒後に割り込み機構を使用してスレッドを強制終了します。
それを知っています
以下の手順でサンプルプログラムを完成させます。
1. PrimeGenerator という名前のクラスを作成し、Thread クラスを継承します。コードは次のとおりです。
次のようにコードをコピーします。
public class PrimeGenerator extends Thread {
2. run() メソッドを書き換え、メソッド内に無限ループを追加し、1 から始まる連続する正の整数が素数であるかどうかを計算によって確認します。その場合は、コンソールに出力します。コードは次のとおりです。
次のようにコードをコピーします。
@オーバーライド
public void run() {
長い数字 = 1L;
while (true) {
if (isPrime(数値)) {
System.out.printf("Number %d /tis Prime.", number);
}
3. 数値を処理した後、isInterrupted() メソッドを呼び出してスレッドが中断されたかどうかを確認します。このメソッドが true を返した場合、文がコンソールに出力され、スレッドの実行が終了します。コードは次のとおりです。
次のようにコードをコピーします。
if (isInterrupted()) {
System.out.println("プライム ジェネレーターが中断されました");
戻る;
}
数値++;
}
}
4. isPrime() メソッドを実装します。このメソッドは、パラメータが素数であるかどうかを判断するために使用され、素数である場合は true を返し、それ以外の場合は false を返します。コードは次のとおりです。
次のようにコードをコピーします。
/**
* パラメータが素数かどうかを判断します
*
* @paramnumber 判定対象の番号
* @戻る
*/
プライベートブール値 isPrime(長い数値) {
if (数値 <= 2) {
true を返します。
}
for (int i = 2; i < 数値; i++) {
if ((数値 % i) == 0) {
false を返します。
}
}
true を返します。
}
5. サンプルプログラムのメインクラス、Mainクラス、main()メソッドを実装します。コードは次のとおりです。
次のようにコードをコピーします。
パブリッククラス Main {
public static void main(String[] args) {
6. PrimeGenerator オブジェクトを作成し、スレッドを開始します。コードは次のとおりです。
次のようにコードをコピーします。
スレッドタスク = new PrimeGenerator();
task.start();
7. 5 秒待ってからスレッドを終了します。コードは次のとおりです。
次のようにコードをコピーします。
試す {
TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
e.printStackTrace();
}
task.interrupt();
8. 例を実行し、結果を表示します。
理由を知っています
以下は、プログラムの実行例の印刷されたスニペットです。出力された文字から、PrimeGenerator スレッドがどのように情報を出力し、スレッドの中断を検出したときにその実行を終了する方法がわかります。
次のようにコードをコピーします。
番号43063はプライムです。
番号43067はプライムです。
番号43093はプライムです。
番号43103はプライムです。
番号43117はプライムです。
プライムジェネレーターが中断されました
Thread には、スレッドが中断されたかどうかを示すブール関数があります。 interrupt() メソッドが呼び出されると、true に設定されます。 isInterrupted() メソッドは、プロパティの現在の値を返します。
終わりのない
Thread には、スレッドが中断されているかどうかを確認するメソッドもあります。それは、現在実行中のスレッドが中断されているかどうかを確認できる静的メソッド Interrupted() です。
次のようにコードをコピーします。
isInterrupted() メソッドとinterrupted() メソッドの間には大きな違いがあります。前者はスレッドが中断されるかどうかのプロパティ値を変更しませんが、後者は値を false に設定できます。 interrupted() は静的メソッドであるため、日常の開発には isInterrupted() メソッドを使用することをお勧めします。
前述したように、スレッドは割り込み要求を無視して実行を続行できます。しかし、これは私たちが望む結果ではありません。
ドクトリンを使用する
この記事は「Java 7 Concurrency Cookbook」(D Gua Ge が「Java7 Concurrency Example Collection」として盗用しました) を翻訳したものであり、学習教材としてのみ使用されます。許可なく商業目的で使用することはできません。
小さな成功
サンプル プログラムで使用されているすべてのコードの完全版。
PrimeGenerator クラスの完全なコードは次のとおりです。
パッケージ com.diguage.books.concurrencycookbook.chapter1.recipe3;
/**
* 日付: 2013-09-18
* 時間: 11:53
*/
public class PrimeGenerator extends Thread {
@オーバーライド
public void run() {
長い数字 = 1L;
while (true) {
if (isPrime(数値)) {
System.out.printf("Number %d /tis Prime./n", number);
}
if (isInterrupted()) {
System.out.println("プライム ジェネレーターが中断されました");
戻る;
}
数値++;
}
}
/**
* パラメータが素数かどうかを判断します
*
* @paramnumber 判定対象の番号
* @戻る
*/
プライベートブール値 isPrime(長い数値) {
if (数値 <= 2) {
true を返します。
}
for (int i = 2; i < 数値; i++) {
if ((数値 % i) == 0) {
false を返します。
}
}
true を返します。
}
}
Mainクラスの完全なコード
次のようにコードをコピーします。
パッケージ com.diguage.books.concurrencycookbook.chapter1.recipe3;
java.util.concurrent.TimeUnitをインポートします。
/**
* 日付: 2013-09-18
* 時間: 12:33
*/
パブリッククラス Main {
public static void main(String[] args) {
スレッドタスク = new PrimeGenerator();
task.start();
試す {
TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
e.printStackTrace();
}
task.interrupt();
}
}