JAva同時:スレッド中断


全部で3つの方法です.
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();// 
	}