Java終止線程的兩種方法
終止的基本思路
正常情況下不會(huì)出現(xiàn)run還沒(méi)有執(zhí)行完,線程突然就沒(méi)了的情況,所以我們想要終止線程就要讓run盡快執(zhí)行完畢,以下代碼都是通過(guò)讓run盡快執(zhí)行完畢這個(gè)思路來(lái)終止線程的
一.程序員手動(dòng)設(shè)置標(biāo)志位
package 停止多線程的方式; /** * Created with IntelliJ IDEA. * Description: * User: wuyulin * Date: 2023-07-24 * Time: 23:06 */ //1.程序員手動(dòng)設(shè)置標(biāo)志位,通過(guò)手動(dòng)設(shè)置的標(biāo)志位來(lái)讓run盡快結(jié)束 public class Demo1 { private static boolean isQuit=false; public static void main(String[] args) { //boolean isQuit=false; Thread thread=new Thread(()->{ while (!isQuit){ System.out.println("hello thread"); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } }); thread.start(); try { Thread.sleep(4000); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("標(biāo)注位修改,進(jìn)程退出"); isQuit=true; } }
在該方法中需要注意標(biāo)志位的初始化位置,可以看lambda表達(dá)式中調(diào)用局部變量發(fā)生錯(cuò)誤這篇博客描述了更多細(xì)節(jié)
二.使用Thread自帶的標(biāo)志位
package 停止多線程的方式; /** * Created with IntelliJ IDEA. * Description: * User: wuyulin * Date: 2023-07-25 * Time: 12:17 */ //使用Thread自帶的標(biāo)志位 public class Demo2 { public static void main(String[] args) { Thread thread=new Thread(()->{ //調(diào)用currentThread()靜態(tài)方法可以獲得當(dāng)前線程的對(duì)象,也就是定義好了的thread // 再用這個(gè)對(duì)象去調(diào)用isInterrupted()方法獲得Thread自帶的標(biāo)志位 while (!Thread.currentThread().isInterrupted()){ //Thread.currentThread().isInterrupted()可以用Thread.interrupted()代替 // 但是不建議,因?yàn)閕nterrupted()方法會(huì)在判定標(biāo)志位的同時(shí)清除標(biāo)志位 System.out.println("hello thread"); try { Thread.sleep(1000); } catch (InterruptedException e) { //throw new RuntimeException(e); break; } } }); thread.start(); try { Thread.sleep(4000); } catch (InterruptedException e) { throw new RuntimeException(e); } thread.interrupt(); //調(diào)用interrupt()方法時(shí)要是線程正在sleep當(dāng)中就會(huì)強(qiáng)制使sleep拋出一個(gè)異常,立即喚醒,但是sleep喚醒了以后 //會(huì)自動(dòng)清除前面設(shè)置的標(biāo)志位,給程序員留下更多的操作空間(接下來(lái)的操作在catch中寫,比如要終止線程,就在catch中寫break) } }
1.要通過(guò)Thread.currentThread().isInterrupted()來(lái)獲取Thread自帶的標(biāo)志位,調(diào)用currentThread()靜態(tài)方法可以獲得當(dāng)前線程的對(duì)象,也就是定義好了的thread,再用這個(gè)對(duì)象去調(diào)用isInterrupted()方法獲得Thread自帶的標(biāo)志位,這段代碼可以用Thread.interrupted()代替但是不建議,因?yàn)閕nterrupted()方法會(huì)在判定標(biāo)志位的同時(shí)清除標(biāo)志位,所以不合理,不推薦使用。
2.當(dāng)線程中有sleep時(shí)就說(shuō)明線程在一些時(shí)刻是處于睡眠狀態(tài)的,就會(huì)有一些特殊情況,調(diào)用interrupt()方法時(shí)要是線程正在sleep當(dāng)中就會(huì)強(qiáng)制使sleep拋出一個(gè)異常,立即喚醒,但是sleep喚醒了以后會(huì)自動(dòng)清除前面設(shè)置的標(biāo)志位,給程序員留下更多的操作空間(接下來(lái)的操作在catch中寫,比如要終止線程,就在catch中寫break)
3.要是線程中沒(méi)有sleep時(shí),thread.interrupt()就正常的修改標(biāo)志位,將while循環(huán)結(jié)束,正常終止線程
到此這篇關(guān)于Java終止線程的兩種方法的文章就介紹到這了,更多相關(guān)Java終止線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用java生成html文件實(shí)現(xiàn)原理及代碼
用printStream來(lái)向html文件里輸出數(shù)據(jù),先創(chuàng)建一個(gè)StringBuilder對(duì)象,通過(guò)append方法來(lái)為其添加html語(yǔ)句,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下,希望對(duì)大家有所幫助2013-08-08JavaWeb response完成重定向?qū)崿F(xiàn)過(guò)程詳解
這篇文章主要介紹了JavaWeb response完成重定向?qū)崿F(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02使用Java橋接模式打破繼承束縛優(yōu)雅實(shí)現(xiàn)多維度變化
這篇文章主要為大家介紹了使用Java橋接模式打破繼承束縛,優(yōu)雅實(shí)現(xiàn)多維度變化,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05java如何刪除以逗號(hào)隔開的字符串中某一個(gè)值
這篇文章主要介紹了java如何刪除以逗號(hào)隔開的字符串中某一個(gè)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列的詳解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列,在Java的時(shí)候,對(duì)于棧與隊(duì)列的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時(shí)候能夠有扎實(shí)的基礎(chǔ)能力。本文小編就來(lái)詳細(xì)說(shuō)說(shuō)Java中的棧與隊(duì)列,需要的朋友可以參考一下2022-01-01java中將list用逗號(hào)隔開拼成字符串的4種方法例子
我們經(jīng)常在開發(fā)過(guò)程之中會(huì)遇到需要把返回的Id list轉(zhuǎn)換為一個(gè)使用逗號(hào)(,)分隔的字符串,下面這篇文章主要給大家介紹了關(guān)于java中將list用逗號(hào)隔開拼成字符串的4種方法例子,需要的朋友可以參考下2024-01-01