java中如何停止一個(gè)正在運(yùn)行的線程
如何停止一個(gè)正在運(yùn)行的線程
1)設(shè)置標(biāo)志位
如果線程的run方法中執(zhí)行的是一個(gè)重復(fù)執(zhí)行的循環(huán),可以提供一個(gè)標(biāo)記來控制循環(huán)是否繼續(xù)
代碼示例:
public class FunDemo02 { /** * 練習(xí)2:設(shè)計(jì)一個(gè)線程:運(yùn)行10秒后被終止(掌握線程的終止方法) * @param args */ public static void main(String[] args) throws Exception{ MyRunable02 runnable = new MyRunable02(); new Thread(runnable).start(); Thread.sleep(10000); // 主線程休眠10秒鐘 runnable.flag = false; System.out.println("main、 end ..."); } } class MyRunable02 implements Runnable{ boolean flag = true; @Override public void run() { while(flag){ try { Thread.sleep(1000); System.out.println(new Date()); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + " 執(zhí)行完成"); } }
2)利用中斷標(biāo)志位
在線程中有個(gè)中斷的標(biāo)志位,默認(rèn)是false,當(dāng)我們顯示的調(diào)用 interrupted方法或者isInterrupted方法是會(huì)修改標(biāo)志位為true。
我們可以利用此來中斷運(yùn)行的線程。
代碼示例:
package com.bobo.fundemo; public class FunDemo07 extends Thread{ public static void main(String[] args) throws InterruptedException { Thread t1 = new FunDemo07(); t1.start(); Thread.sleep(3000); t1.interrupt(); // 中斷線程 將中斷標(biāo)志由false修改為了true // t1.stop(); // 直接就把線程給kill掉了 System.out.println("main .... "); } @Override public void run() { System.out.println(this.getName() + " start..."); int i = 0 ; // Thread.interrupted() 如果沒有被中斷 那么是false 如果顯示的執(zhí)行了interrupt 方法就會(huì)修改為 true while(!Thread.interrupted()){ System.out.println(this.getName() + " " + i); i++; } System.out.println(this.getName()+ " end .... "); } }
3)利用InterruptedException異常
如果線程因?yàn)閳?zhí)行join(),sleep()或者wait()而進(jìn)入阻塞狀態(tài),此時(shí)要想停止它,可以讓他調(diào)用interrupt(),程序會(huì)拋出InterruptedException異常。
我們利用這個(gè)異??梢詠斫K止線程。
package com.bobo; public class FunDemo08 extends Thread{ public static void main(String[] args) throws InterruptedException { Thread t1 = new FunDemo08(); t1.start(); Thread.sleep(3000); t1.interrupt(); // 中斷線程 將中斷標(biāo)志由false修改為了true // t1.stop(); // 直接就把線程給kill掉了 System.out.println("main .... "); } @Override public void run() { System.out.println(this.getName() + " start..."); int i = 0 ; // Thread.interrupted() 如果沒有被中斷 那么是false 如果顯示的執(zhí)行了interrupt 方法就會(huì)修改為 true while(!Thread.interrupted()){ //while(!Thread.currentThread().isInterrupted()){ try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); break; } System.out.println(this.getName() + " " + i); i++; } System.out.println(this.getName()+ " end .... "); } }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Lombok 的@StandardException注解解析
@StandardException 是一個(gè)實(shí)驗(yàn)性的注解,添加到 Project Lombok 的 v__1.18.22 版本中,在本教程中,我們將使用 Lombok 的 @StandardException 注解自動(dòng)生成異常類型類的構(gòu)造函數(shù),需要的朋友可以參考下2023-05-05Java使用Lua實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)展和腳本自動(dòng)升級
Lua是一種輕量級的腳本語言,常用于游戲開發(fā)和嵌入式系統(tǒng)中,這篇文章主要介紹了Java如何調(diào)用Lua實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)展和腳本自動(dòng)升級,感興趣的可以學(xué)習(xí)下2023-08-08Java?數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹題集下
二叉樹可以簡單理解為對于一個(gè)節(jié)點(diǎn)來說,最多擁有一個(gè)上級節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將帶你通過實(shí)際題目來熟練掌握2022-04-04Java利用Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器的示例代碼
這篇文章主要介紹了Java利用Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02基于Java實(shí)現(xiàn)遍歷文件目錄并去除中文文件名
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)遍歷文件目錄并去除中文文件名,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2024-03-03Java處理科學(xué)計(jì)數(shù)法數(shù)字方式
這篇文章主要介紹了Java處理科學(xué)計(jì)數(shù)法數(shù)字方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07SpringBoot生成jar/war包的布局應(yīng)用
在 Spring Boot 中,"布局應(yīng)用"(Application Layout)指的是打包生成的可執(zhí)行 jar 或 war 文件中的內(nèi)容組織結(jié)構(gòu),本文給大家介紹了SpringBoot生成jar/war包的布局應(yīng)用,需要的朋友可以參考下2024-02-02