摘要:中線程在運行過程中可以通過方法進行中斷,這里需要提到幾個的注意點中斷狀態是可以被清除或者說恢復的中斷請求不是一定會被響應如包中的一些操作,只會標記中斷狀態,而對線程并沒有實際影響調用并不是立即中斷線程執行,而是傳遞了中斷請求下面看如果在這里
java中線程在運行過程中可以通過interrupt方法進行中斷,這里需要提到幾個的注意點:
1、中斷狀態是可以被清除或者說恢復的 2、中斷請求不是一定會被響應(如io包中的一些操作,只會標記中斷狀態,而對線程并沒有實際影響) 3、調用interrupt并不是立即中斷線程執行,而是傳遞了中斷請求
下面看demo
public class MyInterrupt implements Runnable{ private volatile int i = 0; @Override public void run() { while (!Thread.currentThread().isInterrupted()) { System.out.println(i++ + String.valueOf(Thread.currentThread().isInterrupted())); //Point1:如果在這里調用中斷請求,程序會在i=20時拋出異常,但不會中斷,線程繼續執行下去 //if (i == 20) { // cancel(); //} try { Thread.sleep(100); //this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } //Point2:在此處調用中斷請求,最后打印 19:false isInterrupted()返回true所以不在進入循環體 if (i == 20) { cancel(); } } } public void cancel(){ Thread.currentThread().interrupt(); } public static void main(String[] args) { new Thread(new MyInterrupt()).start(); } }
在point1處去中斷時候為什么程序會繼續執行,這里我們看下sleep方法以及wait方法的doc
/** * Causes the currently executing thread to sleep (temporarily cease * execution) for the specified number of milliseconds, subject to * the precision and accuracy of system timers and schedulers. The thread * does not lose ownership of any monitors. * * @param millis * the length of time to sleep in milliseconds * * @throws IllegalArgumentException * if the value of {@code millis} is negative * * @throws InterruptedException * if any thread has interrupted the current thread. The * interrupted status of the current thread is * cleared when this exception is thrown. */ public static native void sleep(long millis) throws InterruptedException;
在jdk8中的注釋中我們可以發現@throws中說明了,如果任意線程發出了中斷請求,當拋出InterruptedException異常后,中斷狀態會被清除,也就是說該線程不會被中斷,再次調用isInterrupted方法則會返回false。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68330.html
摘要:中斷線程當線程的方法方法體執行完畢自然終止或在方法中出現沒有捕獲的異常時意外終止,線程將終止。如果被中斷線程被阻塞,就無法檢測中斷狀態,就會產生異常。 多進程與多線程的本質區別在于:每個進程擁有自己的一整套變量,而線程則共享數據。如果需要執行一個比較耗時的任務,應該使用獨立的線程。 可以通過實現Runnable接口或繼承Thread類來創建獨立的線程。 1) 實現Ruannable接口...
摘要:沒有提供一種安全直接的方法來停止某個線程,但是提供了中斷機制。中斷的原理中斷機制是一種協作機制,也就是說通過中斷并不能直接終止另一個線程,而需要被中斷的線程自己處理中斷。線程的中斷狀態由該方法清除。測試線程是否已經中斷。 1. 引言 當我們點擊某個殺毒軟件的取消按鈕來停止查殺病毒時,當我們在控制臺敲入quit命令以結束某個后臺服務時……都需要通過一個線程去取消另一個線程正在執行的任務...
摘要:可以用代替可以用代替定義的對象的值是不可變的今天就先到這里,大家可以看看這些內容的拓展記得點關注看更新,謝謝閱讀 前言 java高并發第二篇講的是java線程的基礎依舊不多說廢話 線程和進程 進程是操作系統運行的基礎,是一個程序運行的實體,windows上打開任務管理器就能看到進程線程是輕量級的進程,是程序執行的最小單位,是在進程這個容器下進行的 線程基本操作 新建一個線程類有兩種方式...
摘要:最后我們重點關注與一下實際就是調用平臺創建線程的方法來創建線程。線程的中斷標識判斷了解了方法的作用以后,再回過頭來看中這段代碼,就很好理解了。 文章簡介 這一篇主要圍繞線程狀態控制相關的操作分析線程的原理,比如線程的中斷、線程的通信等,內容比較多,可能會分兩篇文章 內容導航 線程的啟動的實現原理 線程停止的實現原理分析 為什么中斷線程會拋出InterruptedException ...
摘要:前言中的線程是使用類實現的,在初學的時候就學過了,也在實踐中用過,不過一直沒從源碼的角度去看過它的實現,今天從源碼的角度出發,再次學習,愿此后對的實踐更加得心應手。如果一個線程已經啟動并且尚未死亡,則該線程處于活動狀態。 showImg(https://segmentfault.com/img/remote/1460000017963014?w=1080&h=720); 前言 Java...
閱讀 1122·2021-09-22 15:32
閱讀 1722·2019-08-30 15:53
閱讀 3253·2019-08-30 15:53
閱讀 1404·2019-08-30 15:43
閱讀 453·2019-08-28 18:28
閱讀 2567·2019-08-26 18:18
閱讀 669·2019-08-26 13:58
閱讀 2528·2019-08-26 12:10