Java併發程式設計基礎 (12)執行緒的中斷

2021-08-16 07:57:16 字數 1568 閱讀 8108

寫在前面:

中斷是執行緒的乙個標識位屬性,表示執行中的執行緒是否對其他執行緒進行了中斷操作。其他執行緒是通過interrupt方法來中斷執行緒。

比如:當乙個執行緒a呼叫sleep方法,進入睡眠狀態,等待1s,等待執行緒b完成,但如果其他執行緒b提前完成,想要執行緒a提前結束睡眠狀態,就會呼叫該執行緒的interrupt方法,中斷執行緒a。

(1) 對於非阻塞的執行緒,呼叫interrupt方法只會改變執行緒的中斷標識位,即thread.isinterrupted()會返回true

(2) 對於可從阻塞狀態中取消的執行緒(比如:執行緒呼叫了thread.sleep/thread.join/object.wait等)呼叫interrupt方法,程式會丟擲乙個interruptedexception異常,同時將中斷狀態置回為true(呼叫thread.interrupted可以對中斷狀態復位)。

isinterrupted方法會檢查執行緒是否中斷,並返回乙個boolean,且不會清楚中斷標誌位。是物件的方法,呼叫方式thread.currentthread.isinterrupted().

interrupted方法同樣會返回中斷標誌位,並重置標誌位。

中斷非阻塞方法,只是更改了標識位,並不影響程式的執行。

package test3;

public class interruptdemo catch (interruptedexception e)

thread1.interrupt(); }}

class threaddemo1 implements runnable

if (thread.currentthread().isinterrupted())

}}

當執行緒呼叫了wait、sleep、join方法時,執行緒會進入阻塞狀態,對執行緒進行中斷,會提前結束阻塞狀態(並不會改變中斷的狀態),並且丟擲乙個interruptedexception。

**:

package test3;

public class interruptdemo catch (interruptedexception e)

thread1.interrupt(); }}

class threaddemo1 implements runnable catch (interruptedexception e)

}}

我們來分析一下**的實現過程:

(1)首先子執行緒啟動,主線程睡眠1秒,這時子執行緒一直處於睡眠即阻塞狀態。

(2)當主線程醒來,對睡眠中的子執行緒中斷,子執行緒停止阻塞狀態,並會丟擲乙個interruptedexception異常。此時列印當前執行緒的中斷狀態為false。注:說明中斷阻塞狀態的執行緒不會改變中斷狀態。

(3)後面如果還有**,仍然會正常執行。

當執行緒被synchronized修飾或者處於reentrantlock.lock()獲取鎖的過程中,則執行緒不可以被中斷。但我們可以使用超時trylock方法來對執行緒中斷,即reentrantlock.trylock(longtimeout, timeunit unit),中斷後,會丟擲乙個interruptedexception異常。

併發程式設計 執行緒基礎

解決髒讀 造成髒讀的原因是在寫入資料 set 的時候,呼叫了讀取資料 get 的方法,造成讀到修改的資料的現象。解決的辦法是 使用synchronize同時對get方法和set方法加鎖,這樣set的時候就無法get 鎖重入 概念 對於拿到某個鎖的執行緒,它由可能再拿到其他的鎖。對於它剛執行完並釋放的...

Java 併發程式設計學習筆記(1) 執行緒的基礎

執行緒 乙個程式有多個任務,每個任務就是乙個執行緒。在我看來,執行緒就是程序裡的任務,負責處理乙個程式裡的元件。可能回重複乙個方法。執行緒的狀態 並不同於大多數文章中說的,其實執行緒有6中狀態,既新建立 new 可執行 rnnable 被阻塞 blocked 等待 waiting 計時等待 time...

java併發程式設計 執行緒封閉

執行緒封閉有三種方式 ad hoc執行緒封閉 棧封閉 threadlocal類 其中ad hoc執行緒封閉一般由程式設計師自己實現,很少用,暫不介紹。將物件封閉在區域性變數中,只有區域性變數才能訪問,保證執行緒安全。下面我們來看一段簡單的 public class animals return nu...