1. 程式人生 > >阻塞(sleep等等)區別 中斷(interrupt)+ 中斷的意義

阻塞(sleep等等)區別 中斷(interrupt)+ 中斷的意義

  在java中,執行緒的中斷(interrupt)只是改變了執行緒的中斷狀態,至於這個中斷狀態改變後帶來的結果,那是無法確定的,有時它更是讓停止中的執行緒繼續執行的唯一手段。不但不是讓執行緒停止執行,反而是繼續執行執行緒的手段。

  對於執行一般邏輯的執行緒,如果呼叫它的interrupt()方法,那麼對這個執行緒沒有任何影響,比如執行緒a正在執行:
while(條件) ++;
這樣的語句,如果其它執行緒呼叫a.interrupt();那麼並不會影響a物件上執行的執行緒,如果在其它執行緒裡測試a的中斷狀態它已經改變,但並不會停止這個執行緒的執行。

  在一個執行緒物件上呼叫interrupt()方法,真正有影響的是wait,join,sleep方法,當然這三個方法包括它們的過載方法。


  請注意:[上面這三個方法都會丟擲InterruptedException],記住這句話,下面我會重複。一個執行緒在呼叫interrupt()後,自己不會丟擲InterruptedException異常,所以你看到interrupt()並沒有丟擲這個異常,所以我上面說如果執行緒a正在執行while(條件) x ++;
你呼叫a.interrupt();後執行緒會繼續正常地執行下去。

  但是,如果一個執行緒被呼叫了interrupt()後,它的狀態是已中斷的.這個狀態對於正在執行wait,join,sleep的執行緒,卻改變了執行緒的執行結果。

  一、對於wait中等待notify/notifyAll喚醒的執行緒,其實這個執行緒已經"暫停"執行,因為它正在某一物件的休息室中,這時如果它的中斷狀態被改變,那麼它就會丟擲異常。這個InterruptedException異常不是執行緒丟擲的,而是wait方法,也就是物件的wait方法內部

會不斷檢查在此物件上休息的執行緒的狀態,如果發現哪個執行緒的狀態被置為已中斷,則會丟擲InterruptedException,意思就是這個執行緒不能再等待了,其意義就等同於喚醒它了。

  這裡唯一的區別是,被notify/All喚醒的執行緒會繼續執行wait下面的語句,而在wait中被中斷的執行緒則將控制權交給了catch語句.一些正常的邏輯要被放到catch中來執行。
  但有時這是唯一手段,比如一個執行緒a在某一物件b的wait中等待喚醒,其它執行緒必須獲取到物件b的監視鎖才能呼叫b.notify()[All],否則你就無法喚醒執行緒a,但在任何執行緒中可以無條件地呼叫a.interrupt();來達到這個目的.只是喚醒後的邏輯你要放在catch中,當然同notify/All一樣,繼續執行a執行緒的條件還是要等拿到b物件的監視鎖。


  二、對於sleep中的執行緒,如果你呼叫了Thread。sleep(一年);現在你後悔了,想讓它早些醒過來,呼叫interrupt()方法就是唯一手段,只有改變它的中斷狀態,讓它從sleep中將控制權轉到處理異常的catch語句中,然後再由catch中的處理轉換到正常的邏輯。同樣,地於join中的執行緒你也可以這樣處理。

相關推薦

阻塞sleep等等區別 中斷interrupt+ 中斷意義

  在java中,執行緒的中斷(interrupt)只是改變了執行緒的中斷狀態,至於這個中斷狀態改變後帶來的結果,那是無法確定的,有時它更是讓停止中的執行緒繼續執行的唯一手段。不但不是讓執行緒停止執行,反而是繼續執行執行緒的手段。  對於執行一般邏輯的執行緒,如果呼叫它的interrupt()方法,那麼對這個

執行緒阻塞中斷sleep、wait、io、鎖四種恢復方式

1、執行緒阻塞 一個執行緒進入阻塞狀態可能的原因: ①通過呼叫sleep(millseconds)使任務進入休眠狀態; class Demo1 implements Runnable thr

poj1502MPI MaelstromDijkstra等等最短路的入門題

                                                                                           MPI Maelstrom Time Limit: 1000MS Memory Limi

掛起和阻塞區別sleep和wait區別

掛起和阻塞區別: (1)掛起是一種主動行為,因此恢復也應該要主動完成。而阻塞是一種被動行為,是在等待事件或者資源任務的表現,你不知道它什麼時候被阻塞,也不清楚它什麼時候會恢復阻塞。 (2)阻塞(pe

Linux後臺進程管理以及ctrl+z掛起、ctrl+c中斷、ctrl+退出和ctrl+dEOF區別(轉)

列表 art 信息 csdn 而是 png detail tps 後臺 一、後臺進程管理命令 fg、bg、jobs、&、ctrl + z、ctrl + c、ctrl + \、ctrl + d1、 &加在一個命令的最後,可以把這個命令放到後臺執行 ,如fire

sleep() 、join、yield有什麼區別

sleep() sleep() 方法需要指定等待的時間,它可以讓當前正在執行的執行緒在指定的時間內暫停執行,進入阻塞狀態,該方法既可以讓其他同優先順序或者高優先順序的執行緒得到執行的機會,也可以讓低優先順序的執行緒得到執行機會。但是 sleep() 方法不

中斷含有死迴圈和sleep的子執行緒java.lang.InterruptedException: sleep interrupted

【轉載】:https://blog.csdn.net/qq_33291307/article/details/78804781 死迴圈執行緒中包含sleep,無法中斷執行緒:在sleep前面新增Thread.current.isInterrupt判斷,跳出死迴圈,因為sleep本身是丟擲一個int

JAVA—sleep和wait區別

Java中的多執行緒是一種搶佔式的機制而不是分時機制。執行緒主要有以下幾種狀態:可執行,執行,阻塞,死亡。搶佔式機制指的是有多個執行緒處於可執行狀態,但是隻有一個執行緒在執行。 當有多個執行緒訪問共享資料的時候,就需要對執行緒進行同步。執行緒中的幾個主要方法的比較:        Thread類的方法:sl

多執行緒——:暫停、恢復、停止執行緒較好的方式,sleep/wait/yield區別

不推薦的 大家都知道:suspend()、resume()、stop()這些方法已經被廢棄了。suspend()、resume()如果使用不當,容易造成公共的同步物件資源的獨佔以及導致資料不同步。用官網的話說: This method has

java中執行緒阻塞sleep、suspend、join、wait、resume、notify方法解析

java執行緒的5狀態包括create、runnable、running、blocked、dead。 create是指用new執行緒被建立,但是還沒有準備好各種資源。 runnable是指使用start啟動執行緒,這時候系統會為執行緒分配除cpu以外的所有需要的資源。 ru

Linux後臺程序管理以及ctrl+z掛起、ctrl+c中斷、ctrl+\(退出和ctrl+dEOF區別

轉自:http://blog.csdn.net/fengyifei11228/article/details/5737371             http://idas643.blog.163.com/blog/static/1671048382013414938465

在一個類中寫完多線程sleep 方法和wait 方法的區別

對象 div method pri stat 展示 done lock star 繼承Thread()類完成多線程,一般需要4步: (1)新建一個MyThread類繼承Thread類 (2)在MyThread類中重寫run()方法 (3)在主線程中創建線程對象 Thr

SpringMVC的攔截器Interceptor和過濾器Filter區別與聯系

get err 實例 分享 切面 簡介 () lee XML 一 簡介 (1)過濾器: 依賴於servlet容器。在實現上基於函數回調,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器實例只能在容器初始化時調用一次。使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取

[CF808B] Average Sleep Time[強行]樹狀數組,數學

printf set urn pac int typedef open .com class 題目鏈接:http://codeforces.com/contest/808/problem/B 題意:n個數,求其中每k個數的和的平均值。 鬼知道我怎麽會石樂誌上來就用了樹狀數組

Java 局部變量、實例變量、類變量靜態變量區別

其中 對象 llc -c cli num 改變 system name 1. 局部變量: 局部變量是類的方法中的變量; 2. 實例變量: 實例變量也是類中獨立於方法之外的變量,不過沒有static修飾,也叫 對象變量 3. 類變量(靜態變量): 類變量是類中獨立於方法之外的

MySQL表類型MyISAM/InnoDB的區別解決事務不回滾的問題

span into article one 工具 tab select var pan MyISAM:這個是默認類型,它是基於傳統的ISAM類型,ISAM是Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫,它是存儲記錄和文件

多線程start與run區別

通過 系統 調用 tar start 時間片 運行 實現 狀態 start()用來啟動一個線程,當調用start()方法時,系統才會開啟一個線程,通過Thread類中的start()方法來啟動的線程處於就緒狀態(可運行狀態),此時並沒有運行,一旦得到CPU時間片,

java與javax的區別分析

mes ges 歷史 java虛擬機 虛擬 over 問題 c語言 enc Java是一種受C語言影響的編程語言。Java和Javax本質上是與Java編程語言的上下文一起使用的包。實際上Java和Javax沒有區別。這只是不同的名字。 Java是一種編程語言,受到C語言

從頭認識java-17.2 線程中斷interrupt

detail 由於 main target thread code font 輸出 去掉 這一章節我們來討論一下線程中斷(interrupt)。1.什麽是線程中斷(interrupt)?就是在多線程執行的時候,我們給線程貼上一個中斷的標記。可是不要求線程終止。 2.樣例:

值傳遞和引用傳遞不是引用類型的傳遞區別

com this static 實現 pre 對象 ffffff -c wap 值傳遞:方法調用時,實際參數把它的值傳遞給對應的形式參數,方法執行中形式參數值的改變不影響實際參數的值。引用傳遞:也稱為傳地址。方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方法中