JAva同時:スレッド中断
3228 ワード
全部で3つの方法です.
次の2つのコードを見てください.
彼らの違いが見えます.
しかし、新しい問題が発生しました.中断したのではないでしょうか.なぜ後の印刷が実行できるのですか?
よしこれはドキュメントを読む必要があります.
ドキュメントに記載されている割り込み方法は上から下へ判断され、条件に合致する場合は、この措置を実行し、下へ貫通しない.
1.他のスレッドがスレッドの割り込みを呼び出す場合、checkAccess()メソッドが実行され、SecurityExceptionを引き起こす可能性がある.スレッド自体が呼び出す自身の割り込みであれば問題ない.
2.この時点でスレッドがwait()、join()、sleep()でブロックすると、異常InterruptedExceptionが放出される.割り込み状態クリアだがロック・サポートpart()は言いませんでした.
3.この時点でスレッドがIOでブロックすると、流通路が閉じるjavaが放出される.nio.channels.ClosedByInterruptException.割り込み状態に設定.
4.スレッドがjavaにある場合.nio.channels.Selectorでブロックすると、スレッドは結果をすぐに返します.割り込み状態に設定.
5.以上の条件が成立する場合は、割り込み状態とする.
私たちの上の例は5つ目の一致しかないようです.つまり、中断状態に設定するだけで、他はしません.
もう一つの例を見てみましょう.この例は上の2番目の例に合います.異常を投げ出すステータスクリア
実は異常を投げ出すのはスレッドを終了する良い方法である.リソースを整理することを忘れないでください.異常に注意するとロックが解除されます
もう一つの例ではioブロックの状況を見ると、実際には上記の3番目のルールとは全然違います.
本の中では、ブロックフローとsynchronizedの2つはinterrupt()の影響を受けないと言っているようです.
もう一つ疑問があります.以上の5つのルールは、普通は5つ目に命中しますが、5つ目は中断状態を設定しただけで、何の意味がありますか?
実はこのように使うことができます.
Thread.interrupt();// .
Thread.isInterrupted();// , .
Thread.static.interrupted();// , , .
次の2つのコードを見てください.
private void aaa() throws InterruptedException {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().isInterrupted());//false
Thread.currentThread().interrupt();// ,
System.out.println(Thread.currentThread().isInterrupted());//true
}
});
t.start();
}
private void bbb() throws InterruptedException {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().isInterrupted());//false
Thread.interrupted();// ,
System.out.println(Thread.currentThread().isInterrupted());//false
}
});
t.start();
}
彼らの違いが見えます.
しかし、新しい問題が発生しました.中断したのではないでしょうか.なぜ後の印刷が実行できるのですか?
よしこれはドキュメントを読む必要があります.
ドキュメントに記載されている割り込み方法は上から下へ判断され、条件に合致する場合は、この措置を実行し、下へ貫通しない.
1.他のスレッドがスレッドの割り込みを呼び出す場合、checkAccess()メソッドが実行され、SecurityExceptionを引き起こす可能性がある.スレッド自体が呼び出す自身の割り込みであれば問題ない.
2.この時点でスレッドがwait()、join()、sleep()でブロックすると、異常InterruptedExceptionが放出される.割り込み状態クリアだがロック・サポートpart()は言いませんでした.
3.この時点でスレッドがIOでブロックすると、流通路が閉じるjavaが放出される.nio.channels.ClosedByInterruptException.割り込み状態に設定.
4.スレッドがjavaにある場合.nio.channels.Selectorでブロックすると、スレッドは結果をすぐに返します.割り込み状態に設定.
5.以上の条件が成立する場合は、割り込み状態とする.
私たちの上の例は5つ目の一致しかないようです.つまり、中断状態に設定するだけで、他はしません.
もう一つの例を見てみましょう.この例は上の2番目の例に合います.異常を投げ出すステータスクリア
実は異常を投げ出すのはスレッドを終了する良い方法である.リソースを整理することを忘れないでください.異常に注意するとロックが解除されます
private void sleep() throws InterruptedException {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().isInterrupted());// sleep ,false
try {
Thread.currentThread().sleep(20000);// ,
System.out.println(Thread.currentThread().isInterrupted());// , .
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().isInterrupted());// ,false
e.printStackTrace();
}
}
});
t.start();
Thread.sleep(1000);
t.interrupt();
}
もう一つの例ではioブロックの状況を見ると、実際には上記の3番目のルールとは全然違います.
private void read() throws InterruptedException {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
};
Thread t = new Thread(runnable);
t.start();
Thread.sleep(1000);
t.interrupt();// , , .
}
本の中では、ブロックフローとsynchronizedの2つはinterrupt()の影響を受けないと言っているようです.
もう一つ疑問があります.以上の5つのルールは、普通は5つ目に命中しますが、5つ目は中断状態を設定しただけで、何の意味がありますか?
実はこのように使うことができます.
private void ccc() throws InterruptedException {
Runnable runnable = new Runnable() {
@Override
public synchronized void run() {
while(true){
if (Thread.currentThread().isInterrupted()){
// ,
return;
}
//
}
}
};
Thread t = new Thread(runnable);
t.start();
Thread.sleep(3000);
t.interrupt();//
}