生活随笔
收集整理的這篇文章主要介紹了
Oracle官方并发教程之中断
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原文鏈接,譯文鏈接,譯者: 蘑菇街-小寶 ??校對:梁海艦
中斷是給線程的一個指示,告訴它應(yīng)該停止正在做的事并去做其他事情。一個線程究竟要怎么響應(yīng)中斷請求取決于程序員,不過讓其終止是很普遍的做法。這是本文重點(diǎn)強(qiáng)調(diào)的用法。
一個線程通過調(diào)用對被中斷線程的Thread對象的interrupt()方法,發(fā)送中斷信號。為了讓中斷機(jī)制正常工作,被中斷的線程必須支持它自己的中斷(即要自己處理中斷)
中斷支持
線程如何支持自身的中斷?這取決于它當(dāng)前正在做什么。如果線程正在頻繁調(diào)用會拋InterruptedException異常的方法,在捕獲異常之后,它只是從run()方法中返回。例如,假設(shè)在SleepMessages的例子中,關(guān)鍵的消息循環(huán)在線程的Runnable對象的run方法中,代碼可能會被修改成下面這樣以支持中斷:
| 01 | for?(int?i =?0; i < importantInfo.length; i++) { |
| 02 | ????// Pause for 4 seconds |
| 04 | ???????Thread.sleep(4000); |
| 05 | ????}?catch?(InterruptedException e) { |
| 06 | ???????// We've been interrupted: no more messages. |
| 10 | ?System.out.println(importantInfo[i]); |
許多會拋InterruptedException異常的方法(如sleep()),被設(shè)計(jì)成接收到中斷后取消它們當(dāng)前的操作,并在立即返回。
如果一個線程長時(shí)間運(yùn)行而不調(diào)用會拋InterruptedException異常的方法會怎樣? 那它必須周期性地調(diào)用Thread.interrupted()方法,該方法在接收到中斷請求后返回true。例如:
| 1 | for?(int?i =?0; i < inputs.length; i++) { |
| 2 | ????heavyCrunch(inputs[i]); |
| 3 | ????if?(Thread.interrupted()) { |
| 4 | ????????// We've been interrupted: no more crunching. |
在這個簡單的例子中,代碼只是檢測中斷,并在收到中斷后退出線程。在更復(fù)雜的應(yīng)用中,拋出一個InterruptedException異常可能更有意義。
| 1 | if?(Thread.interrupted()){ |
| 2 | ???throw?new?InterruptedException(); |
這使得中斷處理代碼能集中在catch語句中。
中斷狀態(tài)標(biāo)記
中斷機(jī)制通過使用稱為中斷狀態(tài)的內(nèi)部標(biāo)記來實(shí)現(xiàn)。調(diào)用Thread.interrupt()設(shè)置這個標(biāo)記。當(dāng)線程通過調(diào)用靜態(tài)方法Thread.interrupted()檢測中斷時(shí),中斷狀態(tài)會被清除。非靜態(tài)的isInterrupted()方法被線程用來檢測其他線程的中斷狀態(tài),不改變中斷狀態(tài)標(biāo)記。
按照慣例,任何通過拋出一個InterruptedException異常退出的方法,當(dāng)拋該異常時(shí)會清除中斷狀態(tài)。不過,通過其他的線程調(diào)用interrupt()方法,中斷狀態(tài)總是有可能會立即被重新設(shè)置。
文章轉(zhuǎn)自?并發(fā)編程網(wǎng)-ifeve.com
總結(jié)
以上是生活随笔為你收集整理的Oracle官方并发教程之中断的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。