Java並發編程之線程中斷
線程中斷:
void interrupted()方法:中斷線程,例如,當線程A運行時,線程B可以調用線程A的interrupted()
方法來設置線程的中斷標志為true並立即返回。設置標志僅僅是為瞭設置標志,線程A實際並沒有被中斷,它會繼續往下執行,如果線程A因為調用瞭wait()方法,join()
方法或者sleep()
方法而引起的阻塞掛起,這時候若線程B調用線程A的interrupted()
方法,線程A回調用這些方法的地方會拋出InterruptedException
異常而返回。
boolean isInterrupted()方法:檢測當前線程是否被中斷,如果是返回true
,否則返回false
。
boolean intertupted()方法:檢測當縣線程是否被中斷,如果是返回true,否則返回false。與isInterrupted()
不同的是,該方法如果發現線程被中斷,則會清除中斷標志。
package com.heiye.learn1; import java.util.logging.Logger; public class InterruptedTest { public static void main(String[] args) throws InterruptedException { Logger logger=Logger.getLogger(InterruptedTest.class.toString()); Thread thread=new Thread(new Runnable() { @Override public void run() { //如果當前線程被中斷則退出循環 while (!Thread.currentThread().isInterrupted()){ logger.warning(Thread.currentThread()+"Hello"); } } }); //啟動子線程 thread.start(); //主線程休眠1s,以便中斷當前讓子線程輸出 Thread.sleep(1000); //中斷子線程 logger.warning("main thread interrupted thread"); thread.interrupt(); //等待子線程執行完畢 thread.join(); logger.info("main is over"); } }
在如上代碼中,子線程thread
通過檢查當前線程中斷標志來控制是否退出循環,主線程在休眠1s後調用瞭thread
的interupted()
方法設置瞭中斷標志,所以線程thread退出瞭循環。
下面看一種情況,當線程為瞭等待一些特定條件的到來時候,一般會使用sleep()
方法,wait()
,join()
方法來阻塞掛起當前線程。下面看一個例子:
package com.heiye.learn1; import java.util.logging.Logger; public class InterruptedTest2 { public static void main(String[] args) throws InterruptedException { Logger logger = Logger.getLogger(InterruptedTest.class.toString()); Thread threadOne = new Thread(new Runnable() { @Override public void run() { logger.info("threadOne begin sleep 2000 seconds"); try { Thread.sleep(2000000); logger.info("threadOne awaking"); } catch (InterruptedException e) { logger.warning("threadOne is interrupted while sleeping"); return; //e.printStackTrace(); } logger.warning("threadOne-leaving normally") ; } }); threadOne.start(); //確保子線程進入睡眠狀態 Thread.sleep(1000); //打斷子線程睡眠,讓子線程從sleep返回 threadOne.interrupt(); //等待子線程執行完畢 threadOne.join(); logger.info("main thread is over"); } }
到此這篇關於Java並發編程之線程中斷的文章就介紹到這瞭,更多相關Java線程中斷內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- java中斷機制實例講解
- Java多線程之Interrupt中斷線程詳解
- java高並發InterruptedException異常引發思考
- Java線程中斷interrupt的常用方法
- 一篇文章掌握Java Thread的類及其常見方法