java中如何停止一個正在運(yùn)行的線程
如何停止一個正在運(yùn)行的線程
1)設(shè)置標(biāo)志位
如果線程的run方法中執(zhí)行的是一個重復(fù)執(zhí)行的循環(huán),可以提供一個標(biāo)記來控制循環(huán)是否繼續(xù)
代碼示例:
public class FunDemo02 {
/**
* 練習(xí)2:設(shè)計(jì)一個線程:運(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)志位
在線程中有個中斷的標(biāo)志位,默認(rèn)是false,當(dāng)我們顯示的調(diào)用 interrupted方法或者isInterrupted方法是會修改標(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 方法就會修改為 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),此時要想停止它,可以讓他調(diào)用interrupt(),程序會拋出InterruptedException異常。
我們利用這個異常可以來終止線程。
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 方法就會修改為 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é)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Lombok 的@StandardException注解解析
@StandardException 是一個實(shí)驗(yàn)性的注解,添加到 Project Lombok 的 v__1.18.22 版本中,在本教程中,我們將使用 Lombok 的 @StandardException 注解自動生成異常類型類的構(gòu)造函數(shù),需要的朋友可以參考下2023-05-05
Java使用Lua實(shí)現(xiàn)動態(tài)擴(kuò)展和腳本自動升級
Lua是一種輕量級的腳本語言,常用于游戲開發(fā)和嵌入式系統(tǒng)中,這篇文章主要介紹了Java如何調(diào)用Lua實(shí)現(xiàn)動態(tài)擴(kuò)展和腳本自動升級,感興趣的可以學(xué)習(xí)下2023-08-08
Java?數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹題集下
二叉樹可以簡單理解為對于一個節(jié)點(diǎn)來說,最多擁有一個上級節(jié)點(diǎn),同時最多具備左右兩個下級節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將帶你通過實(shí)際題目來熟練掌握2022-04-04
Java利用Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器的示例代碼
這篇文章主要介紹了Java利用Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
基于Java實(shí)現(xiàn)遍歷文件目錄并去除中文文件名
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)遍歷文件目錄并去除中文文件名,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2024-03-03
Java處理科學(xué)計(jì)數(shù)法數(shù)字方式
這篇文章主要介紹了Java處理科學(xué)計(jì)數(shù)法數(shù)字方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
SpringBoot生成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

