色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用stop、suspend方法來中斷線程的壞處在哪?

Android編程精選 ? 來源:CSDN技術社區 ? 作者:浪舟子 ? 2021-07-26 14:23 ? 次閱讀

我們知道像stop、suspend這幾種中斷或者阻塞線程的方法在較高java版本中已經被標記上了@Deprecated過期標簽,那么為什么她們曾經登上了java的歷史舞臺而又漸漸的推出了舞臺呢,到底是人性的扭曲還是道德的淪喪呢,亦或是她們不思進取被取而代之呢,如果是被取而代之,那么取而代之的又是何方人也,本文我們將一探究竟。

一、stop的落幕首先stop方法的作用是什么呢,用java源碼中的一句注釋來了解一下:Forces the thread to stop executing.,即強制線程停止執行,‘Forces’似乎已經透漏出了stop方法的蠻狠無理。那么我們再看看java開發者是怎們解釋stop被淘汰了的。

我們從中可以看出以下幾點:

stop這種方法本質上是不安全的

使用Thread.stop停止線程會導致它解鎖所有已鎖定的監視器,即直接釋放當前線程已經獲取到的所有鎖,使得當前線程直接進入阻塞狀態

我們舉例來看一下上邊提到的兩點:

public static void main(String[] args) throws InterruptedException {

Object o1=new Object();

Object o2=new Object();

Thread t1=new Thread(()-》{

synchronized (o1)

{

synchronized (o2)

{

try {

System.out.println(“t1獲取到鎖”);

Thread.sleep(5000);

System.out.println(“t1結束”);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

});

t1.start();

Thread.sleep(1000);

Thread t2=new Thread(()-》{

synchronized (o1)

{

synchronized (o2)

{

try {

System.out.println(“t2獲取到鎖”);

Thread.sleep(5000);

System.out.println(“t2結束”);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

});

t2.start();

t1.stop();

}

運行結果:

1fb0958c-e009-11eb-9e57-12bb97331649.png

可以看到,當線程t1在獲取到o1和o2兩個鎖開始執行,在還沒有執行結束的時候,主線程調用了t1的stop方法中斷了t1的執行,釋放了t1線程獲取到的所有鎖,中斷后t2獲取到了o1和o2鎖,開始執行直到結束,而t1卻夭折在了sleep的時候,sleep后的代碼沒有執行。

因此使用stop我們在不知道線程到底運行到了什么地方,暴力的中斷了線程,如果sleep后的代碼是資源釋放、重要業務邏輯等比較重要的代碼的話,亦或是其他線程依賴t1線程的運行結果,那直接中斷將可能造成很嚴重的后果。

那么不建議使用stop中斷線程我們應該怎么去優雅的結束一個線程呢,我們可以存java開發者的注釋中窺探到一種解決方案:

1fdbe836-e009-11eb-9e57-12bb97331649.png

可以看到java開發者推薦我們使用以下兩種方法來優雅的停止線程:

1.定義一個變量,由目標線程去不斷的檢查變量的狀態,當變量達到某個狀態時停止線程。

代碼舉例如下:

volatile static boolean flag=false;

public static void main(String[] args) throws InterruptedException {

Object o1=new Object();

Thread t1=new Thread(()-》{

synchronized (o1)

{

try {

System.out.println(“t1獲取到鎖”);

while (!flag)

Thread.sleep(5000);//執行業務邏輯

System.out.println(“t1結束”);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

});

t1.start();

Thread.sleep(1000);

Thread t2=new Thread(()-》{

synchronized (o1)

{

try {

System.out.println(“t2獲取到鎖”);

Thread.sleep(5000);//執行業務邏輯

System.out.println(“t2結束”);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

});

t2.start();

flag=true;

}

運行結果:

1ffacdc8-e009-11eb-9e57-12bb97331649.png

2.使用interrupt方法中斷線程。

代碼舉例如下:

public static void main(String[] args) throws InterruptedException {

Object o1=new Object();

Thread t1=new Thread(()-》{

synchronized (o1)

{

System.out.println(“t1獲取到鎖”);

while (!Thread.currentThread().isInterrupted()) {

for (int i = 0; i 《 100; i++) {

if(i==50)

System.out.println();

System.out.print(i+“ ”);

}

System.out.println();

}

System.out.println(“t1結束”);

}

});

t1.start();

Thread t2=new Thread(()-》{

synchronized (o1)

{

try {

System.out.println(“t2獲取到鎖”);

Thread.sleep(5000);//執行業務邏輯

System.out.println(“t2結束”);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

});

t2.start();

t1.interrupt();

}

運行結果:

202dbdb4-e009-11eb-9e57-12bb97331649.png

我們用while (!Thread.currentThread().isInterrupted())來不斷判斷當前線程是否被中斷,中斷的話則讓線程自然消亡并釋放鎖。可以看到調用interrupt方法后并不會像stop那樣暴力的中斷線程,會等到當前運行的邏輯結束后再檢查是否中斷,非常的優雅。另外,關注Java知音公眾號,回復“后端面試”,送你一份面試題寶典!

注:運行舉例代碼可能不會打印出數字,這是因為t1線程運行到while(!Thread.currentThread().isInterrupted())時,主線程已經調了interrupt方法,因此多次運行可能會打印出數字。

二、suspend的落幕suspend方法的作用是掛起某個線程直到調用resume方法來恢復該線程,但是調用了suspend方法后并不會釋放被掛起線程獲取到的鎖,正因如此就給suspend和resume這哥倆貼上了容易引發死鎖的標簽,當然這也正是導致suspend和resume退出歷史舞臺的罪魁禍首。同樣我們看看java開發者為suspend的淘汰給出的理由:

206731fc-e009-11eb-9e57-12bb97331649.png

從中我們可以得出以下結論:

suspend具有天然的死鎖傾向

當某個線程被suspend后,該線程持有的鎖不會被釋放,其他線程也就不能訪問這些資源

suspend某個線程后,如果在resume的過程中出現異常導致resume方法執行失敗,則lock無法釋放,導致死鎖

接下來模擬一下由suspend引起的死鎖場景,Talk is cheap,show my code:

public static void main(String[] args) throws InterruptedException {

Object o1=new Object();

Object o2=new Object();

Thread t1=new Thread(()-》{

synchronized (o1)

{

System.out.println(“t1獲取到o1鎖開始執行”);

try {

Thread.sleep(5000);//模擬執行業務邏輯

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“t1執行結束”);

}

});

t1.start();

Thread t2=new Thread(()-》{

synchronized (o2)

{

System.out.println(“t2獲取到o2開始執行”);

try {

Thread.sleep(2000);//執行耗時業務

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (o1)

{

System.out.println(“t2獲取到o1鎖開始繼續執行”);

}

System.out.println(“t2執行結束”);

}

});

t2.start();

Thread.sleep(1000);

t1.suspend();

//假設拋出了一個未知異常

int i=1/0;

t1.resume();

}

運行結果:

20736242-e009-11eb-9e57-12bb97331649.png

可以看到,整個程序卡的死死的,在調用resume恢復t1線程之前拋出了一個未知異常,導致t1一直掛起進而無法釋放o1鎖,而t2需要獲取到o1鎖后才能繼續執行,但苦苦等待,奈何o1被t1拿捏的死死的,從此整個程序就陷入了無盡的等待中----死鎖。

作者丨浪舟子

blog.csdn.net/qq_40400960/article/details/112651249

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 中斷
    +關注

    關注

    5

    文章

    898

    瀏覽量

    41514

原文標題:為什么強烈不推薦使用stop、suspend方法來中斷線程?

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    socket 多線程編程實現方法

    在現代網絡編程中,多線程技術被廣泛應用于提高服務器的并發處理能力。Socket編程是網絡通信的基礎,而將多線程技術應用于Socket編程,可以顯著提升服務器的性能。 多線程編程的基本概念 多
    的頭像 發表于 11-12 14:16 ?369次閱讀

    斷連塊應用于飛控測試環境斷線測試箱

    斷連塊概述Overviewofdisconnectedblocks斷連塊是一種用于電路中斷連接的連接器,廣泛應用于電子測試設備和通信系統中。它能夠在特定條件下,通過手動插拔精準地中斷電路連接,以此
    的頭像 發表于 10-09 08:06 ?240次閱讀
    斷連塊應用于飛控測試環境<b class='flag-5'>斷線</b>測試箱

    rtthread是搶占式的rtos,那么線程的timeout參數具體的作用是什么呢?

    查閱相關說明,rtthread是搶占式的rtos,那么線程的timeout參數具體的作用是什么呢, 假如線程A,B的優先級分別是1和2,timeout是10ms。當線程B 在運行中,還未到timeout,此刻掛起的
    發表于 09-27 08:39

    控制回路斷線可能原因及如何處理

    控制回路斷線是電氣系統中常見的故障之一,它可能導致設備無法正常工作,甚至引發安全事故。本文將分析控制回路斷線的可能原因,并提出相應的處理方法。 一、控制回路斷線的可能原因 接線錯誤 接
    的頭像 發表于 08-23 16:36 ?2161次閱讀

    armv8在啟動剛開始時調用了關中斷,一直到切換第一個線程在哪里開啟的中斷呢?

    例如當前使用的armv8芯片,在啟動剛開始時調用了關中斷,一直到切換第一個線程在哪里開啟的中斷呢? int rtthread_startup(void
    發表于 07-04 07:00

    AD8338有沒有可行的方法來測量大增益?

    AD8338是一款VGA芯片,可變增益范圍為-10dB至70dB。然而,理論上的70dB增益過大,導致來自源的輸入信號非常小,容易受到干擾,導致70dB增益未得到驗證。有沒有可行的方法來測量大增益?
    發表于 05-21 07:06

    STM32F107的OTG在stop模式下無法通過EXTI_18喚醒,沒有中斷產生是怎么回事?

    作為device,想驗證EXTI_18的中斷,配置好EXTI初始化,但只有在enable suspend int后,在插拔USB線纜時才會進OTG_FS_WKUP_IRQHandler,如果配置設備
    發表于 05-06 08:59

    使用FreeRTOS創建的DHCP線程里面的DHCP是在哪里定義的?

    請教下,使用 FreeRTOS 創建的 DHCP 線程里面的 DHCP 是在哪里定義的,貌似沒有找到 ? FreeRTOS 版本 v9.0.0 具體如下: // 創建 DHCP 線程 void
    發表于 04-30 07:34

    STM8L151不能同時初始化同一中斷線的兩個管腳怎么解決?

    請問,STM8中斷問題,不能同時初始化同一中斷線的兩個管腳,比如PC4,PD4,對應中斷線EXTI4,如果同時初始化PC4/PD4的終端,則中斷不能正常工作。PD4對應按鍵
    發表于 04-28 07:32

    stm32外部中斷不能喚醒stop休眠模式怎么解決?

    按鍵引腳設置成外部中斷方式,可以正常喚醒stop模式;但是充電口設置成外部中斷,卻無法喚醒stop休眠!!!配置都是一樣的,按鍵下降沿觸發,充電檢測是上升沿觸發。 有可能是什么原因,
    發表于 04-26 06:11

    如果是使用六步方波的方法來控制電機,要如何實現過電流保護?

    請問一下如果是使用六步方波的方法來控制電機,要如何實現過電流保護? 以免電流過大造成板子損壞
    發表于 04-22 08:10

    stm32f4如何禁止usb suspend或修改進入suspend的時間?

    手冊說是usb設備在3ms沒有數據就會進入 suspend mode,哪里可以修改時間,或者把3ms修改成3秒,或者禁止usb 進入suspend. DCD_HandleUSBSuspend_ISR USBD_Suspend D
    發表于 04-02 08:06

    看一下通過采用HPC方法來解決汽車行業工程挑戰的兩個具體實例

    大家可能都知道,將Ansys解決方案與高性能計算(HPC)相結合,可帶來巨大的投資回報(ROI)。接下來,讓我們來看一下通過采用HPC方法來解決汽車行業工程挑戰的兩個具體實例。
    的頭像 發表于 03-12 14:29 ?574次閱讀

    加濕器的作用及好處與壞處 加濕器的正確使用方法

    疾病的發生。然而,過度使用加濕器或錯誤使用也可能會導致空氣中的細菌和霉菌增加,對健康產生負面影響。以下是關于加濕器的作用及好處與壞處以及正確使用方法。 加濕器的作用及好處: 改善干燥環境:加濕器能夠在干燥環境
    的頭像 發表于 01-25 09:52 ?2005次閱讀

    火線斷線和零線斷線的危害

    在我們三相四線的供電回路里,三根火線和一根零線都是不能缺少的,任何一根斷線都會給我們的用電設備造成嚴重的危害,那么火線斷線和零線斷線的造成后果是一樣的嗎?
    的頭像 發表于 01-17 10:02 ?3190次閱讀
    火線<b class='flag-5'>斷線</b>和零線<b class='flag-5'>斷線</b>的危害
    主站蜘蛛池模板: 香蕉59tv视频| 破女在线观看视频| 免费高清在线影片一区| 亚洲 欧美 中文字幕 在线| yellow日本高清在线| 免费人妻AV无码专区五月| 伊人久久大香线蕉avapp下载| 国产性夜夜性夜夜爽91| 无人区乱码区1卡2卡三卡在线| 俄罗斯一级毛片aaaa| 日本高清色片| 大桥未久电影在线| 日本毛片久久国产精品| 白人大战34厘米黑人BD| 欧美最猛性XXX孕妇| GOGOGO高清免费播放| 欧美片第1页 综合| 啊…嗯啊好深男男高h文总受| 欧美巨大xxxx做受孕妇视频| a视频在线看| 日本免费一本天堂在线| 富婆大保健嗷嗷叫普通话对白| 神马影院在线eecss伦理片| 国产成人精品免费青青草原app | 亚洲精品国产专区91在线| 国产在线观看网址你懂得| 亚洲国产精品嫩草影院| 婚后被调教当众高潮H喷水 | 麻花豆传媒剧国产免费mv观看| 51成人精品午夜福利AV免费七| 男子扒开美女尿口做羞羞的事| 扒开校花粉嫩小泬喷潮漫画| 无码人妻少妇色欲AV一区二区 | 后入内射国产一区二区| 真实伦 乱| 日产精品久久久久久久蜜殿| 国产剧情在线精品视频不卡| 伊人22222| 翘臀少妇被扒开屁股日出水爆乳| 国产传媒麻豆剧精品AV| 一本到2v不卡区|