日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle官方并发教程之中断

發(fā)布時(shí)間:2024/4/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
03 ????try?{
04 ???????Thread.sleep(4000);
05 ????}?catch?(InterruptedException e) {
06 ???????// We've been interrupted: no more messages.
07 ??????return;
08 ?}
09 ?// Print a message
10 ?System.out.println(importantInfo[i]);
11}

許多會拋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.
5 ????????return;
6 ????}
7}

在這個簡單的例子中,代碼只是檢測中斷,并在收到中斷后退出線程。在更復(fù)雜的應(yīng)用中,拋出一個InterruptedException異常可能更有意義。

1 if?(Thread.interrupted()){
2 ???throw?new?InterruptedException();
3}

這使得中斷處理代碼能集中在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)容還不錯,歡迎將生活随笔推薦給好友。