女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

    文章

    905

    瀏覽量

    42795

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    想在rtsmart中使用uart2,是不是只能通過修改設備樹方法來實現uart2的復用呀?

    我想在rtsmart中使用uart2,是不是只能通過修改設備樹方法來實現uart2的復用呀? 修改設備樹后如何只編譯設備樹文件? 編譯生成的文件可以直接替換到廬山派里嗎,具體替換路徑在哪里呀?
    發表于 06-24 07:04

    第六章 外部中斷

    本章介紹W55MH32的IO口作為外部中斷輸入的使用。先闡述了NVIC(嵌套向量中斷控制器) 的結構、寄存器、優先級及相關函數,再說明EXTI(外部中斷和事件控制器)的功能。框圖及IO口與
    的頭像 發表于 05-26 16:27 ?516次閱讀
    第六章 外部<b class='flag-5'>中斷</b>

    STM32U5 IWDG的提前喚醒中斷無法在STOP模式下觸發怎么解決?

    我使用的是STM32U585系列芯片,開啟了IWDG,并在運行模式下測試提前喚醒中斷正常觸發,但在進入STOP2模式后,提前喚醒中斷無法觸發導致無法喂狗,看門狗超時后芯片復位。 手冊中寫道IWDG
    發表于 04-27 08:05

    STM32U5 IWDG的提前喚醒中斷無法在STOP模式下觸發怎么解決?

    我使用的是STM32U585系列芯片,開啟了IWDG,并在運行模式下測試提前喚醒中斷正常觸發,但在進入STOP2模式后,提前喚醒中斷無法觸發導致無法喂狗,看門狗超時后芯片復位。 手冊中寫道IWDG
    發表于 04-24 07:50

    使用ad9467-250采集低頻信號,請問有什么方法來提高sfdr嗎?

    你好,我現在在使用ad9467-250采集低頻信號,在測試3Mhz部分時sfdr只有86,采樣頻率是102.4Mhz,請問有什么方法來提高sfdr嗎
    發表于 04-24 06:05

    STM32U5 IWDG的提前喚醒中斷無法在STOP模式下觸發怎么解決?

    我使用的是STM32U585系列芯片,開啟了IWDG,并在運行模式下測試提前喚醒中斷正常觸發,但在進入STOP2模式后,提前喚醒中斷無法觸發導致無法喂狗,看門狗超時后芯片復位。 手冊中寫道IWDG
    發表于 04-22 08:14

    PTD08A010W想把1.8V的輸出通過軟件編程的方法來改成3.3V的輸出,怎么實現?

    我現在在用VC707FPGA開發板,上面用到了PTD08A010W這款電源芯片,這里提供的是12V轉1.8V的功能,但現在我想把1.8V的輸出通過軟件編程的方法來改成3.3V的輸出,請問有誰可以提供具體的幫助嗎?下面是實際的電路以及電路原理圖,我要調的電壓為VADJ_FPGA:
    發表于 03-03 07:55

    程序中斷的100種寫法

    在編程中,實現程序中斷的方式取決于所使用的編程語言、硬件平臺以及具體的應用需求。雖然沒有100種獨立的中斷實現方式,但可以通過不同的方法和技術實現
    發表于 01-28 08:25

    socket 多線程編程實現方法

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

    求助,關于PFFB的設計問題,這樣的設計會有什么好處和壞處

    請教一下關于PFFB的設計問題,這樣的設計會有什么好處和壞處?煩請解答謝謝
    發表于 10-16 06:52

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

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

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

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

    freertos中斷優先級在哪設置

    FreeRTOS是一個流行的實時操作系統,它廣泛應用于嵌入式系統開發。在FreeRTOS中,中斷優先級是一個重要的概念,因為它決定了中斷處理的順序和響應時間。 1. 理解中斷優先級 在討論如何設置
    的頭像 發表于 09-02 14:17 ?1574次閱讀

    控制回路斷線會造成什么后果

    控制回路斷線是一種常見的電氣故障現象,它會導致電氣設備的控制回路中斷,從而影響設備的正常運行。 一、控制回路的概念 控制回路是指電氣設備中用于實現控制功能的電路。它通常由控制元件、執行元件、反饋元件
    的頭像 發表于 08-23 16:38 ?1964次閱讀

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

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