多執行緒基礎篇(2) 理解中斷

2021-09-20 05:17:00 字數 2674 閱讀 1350

執行緒中斷,可以理解為乙個現成的標識屬性,它表示乙個執行中的執行緒是否被其他執行緒進行了中斷操作,中斷可以用來進行強制終結執行緒(使執行緒進入終止狀態),即在執行run方法過程中直接退出(或者說跳過某段**)。

執行緒中斷的方法:

1)stop()方法:不在使用此方法,其中斷線程是立即中斷的,即使是在同步**塊中對資料進行操作時也會立即終止,詳細不在贅述,只需知道該方法不在使用即可。

2)interrupt()方法:其他執行緒呼叫此執行緒的interrupt()方法對其進行中斷操作時,interrupt()方法將執行緒的中斷狀態設定為true,如果該執行緒正處於阻塞或即將處於阻塞狀態,則會發生interruptedexception並被丟擲,當丟擲該異常或使用interrupted()方法判斷是否中斷時將會重置中斷狀態為false。

1) 當其他執行緒呼叫某執行緒的interrupt()方法時,僅僅時將該執行緒的中斷狀態設定為true,並不是一定會立即將該執行緒中斷使其進入終止狀態,相當於其他執行緒對該執行緒說「兄弟,你要結束了」。如果這個執行緒處於阻塞或是即將進入阻塞狀態時則會發生中斷,也可以設定一些中斷條件,通過與isinterrupted()方法進行&&操作實現中斷。**如下:

public

class

demo8

extends

thread

catch (interruptedexception e)

itt.interrupt();

} public

void

run()

catch (interruptedexception e)

} system.out.println("跳出迴圈");

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

} }

2)有兩種情況無法發生中斷:不能中斷正在獲取synchronized鎖或者試圖執行io操作的執行緒,**如下

public

class

demo9

catch (interruptedexception e)

t1.interrupt();

t2.interrupt(); }}

class

ioblocked

implements

runnable

public

void

run()

}catch (ioexception e) else

} system.out.println("io操作執行中"); }}

class

synchronizedblocked

implements

runnable

} public

synchronizedblocked

() }.start();

} @override

public

void

run()

}

3)對於無法中斷的io操作,我們可以通過關閉任務中發生阻塞的底層資源,如上**中的system.in可以通過關閉流的方式來進行中斷。

4)對於無法中斷互斥所引起的阻塞,我們可以使用reentrantlock類的trylock方法或.lockinterruptibly()方法即可解決。

1)當呼叫某個執行緒的interrupt方法時,中斷發生的唯一時刻是在任務即將進入到阻塞操作中時或者已經在阻塞操作內部,若在某個死迴圈中新增了可能會產生阻塞操作的**,但恰巧沒有發生任何阻塞的情況下,我們需要另一種方式來退出。

public

class

interruptthreadtest

extends

thread

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

} public

static

void

main

(string args)

catch (interruptedexception e)

// 設定執行緒的中斷標誌位

itt.interrupt();

} }

2)檢查執行緒中斷的方法:

isinterrupted()方法判斷當前執行緒是否為中斷狀態

interrupted()方法判斷當前執行緒是否為中斷狀態,並且會重置執行緒中斷狀態為false

3)如何正確的安全的終止執行緒:中斷狀態是執行緒的乙個標識位,而中斷操作是一種簡便的執行緒間互動 方式,而這種互動方式最適合用來取消或停止任務。除了中斷以外,還可以利用乙個boolean變 量來控制是否需要停止任務並終止該執行緒。這種通過標識位或者中斷操作的方式能夠使執行緒在終止時有機會去清理資源,而不是武斷地將執行緒停止,因此這種終止執行緒的做法顯得更加安全和優雅。

public

class

shutdown

private

static

class

runner

implements

runnable

system.out.println("count i = " + i);

} public

void

cancel

() }

}

多執行緒基礎篇(2) 理解中斷

執行緒中斷,可以理解為乙個執行緒的標識屬性,它表示乙個執行中的執行緒是否被其他執行緒進行了中斷操作,中斷可以用來進行強制終結執行緒,即在執行run方法過程中直接退出 或者說跳過某段 執行緒中斷的方法 1 stop 方法 不在使用此方法,其中斷線程是立即中斷的,即使是在同步 塊中對資料進行操作時也會立...

多執行緒 執行緒中斷

設計思路 1,新建乙個執行緒,其啟動引數是要輸出其執行狀態。2,中斷主線程若干秒,讓新建執行緒持續運作。3,中斷新建執行緒,輸出起執行次數和執行狀態。int count 0 thread t2 new thread catch threadabortexception absortexception...

iOS 多執行緒(基礎篇)

如果要在1個執行緒中執行多個任務,那麼只能乙個乙個按順序執行這些任務。也就是說,在同乙個時間內,1個程序只能執行1個任務。1個程序中可以開啟多條執行緒,每條執行緒可以並行 同時 執行不同的任務。程序是車間,那麼執行緒就是車間工人。多執行緒技術可以提高程式的執行效率。同一時間內,cpu只能處理一條執行...