問題:
1、線程的中斷方式。
2、為什么中斷阻塞中的線程,會拋出異常。
代碼示例:
package com.hdwl.netty; public class ThreadInterrupted { public static void main(String[] args) { // testNoInterrupted(); // testInterrupted(); testInterruptedWithBlock(); } //測試阻塞線程的中斷 private static void testInterruptedWithBlock() { MyInterruptedBlockThread mibt = new MyInterruptedBlockThread(); mibt.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } mibt.interrupt();//設置中斷標示 } //線程非阻塞中斷的演示 private static void testInterrupted() { MyInterruptedNoBlockThread mibt = new MyInterruptedNoBlockThread(); mibt.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } mibt.interrupt();//設置線程中斷標示 } //不中斷線程的演示,由於未設置中斷標示,所有線程永遠不會中斷。 private static void testNoInterrupted() { MyInterruptedNoBlockThread mibt = new MyInterruptedNoBlockThread(); mibt.start(); } } //阻塞線程 class MyInterruptedBlockThread extends Thread{ @Override public void run() { //如果線程中斷位置為true,則結束while循環 while (!isInterrupted()){ System.out.println("running……"); try { sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); //當阻塞中的線程被中斷,線程的中斷標示被重置,所以需要重新設置 interrupt(); } } System.out.println("線程結束!"); } } //非阻塞線程 class MyInterruptedNoBlockThread extends Thread{ @Override public void run() { //如果線程中斷位置為true,則結束while循環 while (!isInterrupted()){ System.out.println("running……"); } System.out.println("線程結束!"); } }
解答問題:
1、線程的中斷,使用設置中斷標示的方式進行。
2、中斷阻塞中的線程拋出異常,是為了不讓線程無休止的中斷。因為設置中斷標示,線程並不會馬上停止,還需要等待下一次的CPU時間片到來,才能根據interrupted方法的返回值來終止線程。如果某個阻塞線程B,依賴於線程A的notify(或者其它操作,才能喚醒線程B),那么將線程A,B同時設置為中斷標示,此時線程A已經死亡了,而線程B還一直等到喚醒,才能根據interrupted方法,進行線程的中斷操作。因此,中斷阻塞中的線程,必須拋出異常,方便我們進行后續的處理。