java 終止線程的4種方式小結
終止線程一般建議采用的方法是讓線程自行結束,進入Dead(死亡)狀態(tài),就是執(zhí)行完run()方法。即如果想要停止一個線程的執(zhí)行,就要提供某種方式讓線程能夠自動結束run()方法的執(zhí)行。比如設置一個標志來控制循環(huán)是否執(zhí)行,通過這種方式讓線程離開run()方法。
一、使用布爾標志位
在線程的執(zhí)行代碼中,使用一個布爾類型的標志位來標識線程是否需要終止。線程在執(zhí)行過程中,不斷地檢查這個標志位,如果標志位為true,則主動退出線程執(zhí)行的循環(huán)或方法,從而終止線程的執(zhí)行。
public class MyThread implements Runnable {
private volatile boolean flag = true;
public void run() {
while (flag) {
// 執(zhí)行線程任務
}
}
public void stopThread() {
flag = false;
}
}二、使用interrupt()方法
每個線程對象都有一個interrupt()方法。通過調用該方法,可以將線程的中斷狀態(tài)設置為"中斷"。在線程的執(zhí)行代碼中,在適當?shù)奈恢檬褂肨hread.currentThread().isInterrupted()方法來檢查線程的中斷狀態(tài),并在必要時終止線程的執(zhí)行
public class MyThread extends Thread {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
// 執(zhí)行線程任務
}
}
public void stopThread() {
interrupt();
}
}三、使用stop()方法(已過時)
Thread類提供了stop()方法,可以立即終止線程的執(zhí)行。但是該方法已過時,不推薦使用。因為stop()方法可能導致線程不會釋放占用的鎖資源,從而引發(fā)線程安全問題。
public class MyThread extends Thread {
public void run() {
while (true) {
// 執(zhí)行線程任務
}
}
public void stopThread() {
stop();
}
}四、使用Thread.interrupt()方法配合isInterrupted()方法
線程的interrupt()方法會將線程的中斷狀態(tài)設置為"中斷"。在線程的執(zhí)行代碼中,可以使用Thread.currentThread().isInterrupted()方法檢查線程的中斷狀態(tài),并在必要時終止線程執(zhí)行。與方式2相比,這種方式更加靈活,可以處理更復雜的線程終止邏輯。
public class MyThread extends Thread {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
// 執(zhí)行線程任務
// 可能會有一些阻塞操作,如Thread.sleep()等
} catch (InterruptedException e) {
// 捕獲InterruptedException異常,清除中斷狀態(tài)
Thread.currentThread().interrupt();
}
}
}
public void stopThread() {
interrupt();
}
}到此這篇關于java 終止線程的4種方式小結的文章就介紹到這了,更多相關java 終止線程內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mybatis-plus自定義業(yè)務實現(xiàn)方式
本文介紹了使用MyBatis-Plus(簡稱MP)進行數(shù)據庫操作的實現(xiàn)步驟,包括創(chuàng)建實體類、Mapper接口和XML文件、Service接口和實現(xiàn)類,以及測試類,重點強調了業(yè)務層參數(shù)校驗、事務管理以及復雜SQL的處理方式2026-03-03
基于Java+Selenium實現(xiàn)保存網站登錄數(shù)據的詳細指南
在使用 Selenium 進行自動化測試時,頻繁地手動登錄網站可能會非常耗時,為了提高效率,我們可以采取一些措施來保存網站的登錄數(shù)據,本文將詳細介紹兩種常見的方法,需要的朋友可以參考下2025-08-08
springboot項目中jackson-序列化-處理 NULL教程
這篇文章主要介紹了springboot項目中jackson-序列化-處理 NULL教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
SpringBoot+MinIO實現(xiàn)對象存儲的示例詳解
MinIO?是一個基于Apache?License?v2.0開源協(xié)議的對象存儲服務,它是一個非常輕量的服務,可以很簡單的和其他應用的結合,所以下面我們就來看看SpringBoot如何整合MinIO實現(xiàn)對象存儲吧2023-10-10
logback的isDebugEnabled日志配置級別源碼解析
這篇文章主要為大家介紹了logback的isDebugEnabled日志配置級別源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11

