Java終止執行緒的三種方法
- 使用標誌位退出執行緒
- 使用stop方法強制終止執行緒
- 使用interrupt終止執行緒
1. 使用標誌位退出執行緒
這種也是最常用的方法,就是定義一個boolean型的標誌位,線上程的run方法中根據這個標誌位是true還是false來判斷是否退出,這種情況一般是將任務放在run方法中的一個while迴圈中執行的。
public class ThreadFlag extends Thread {
public volatile boolean exit = false;
public void run() {
while (!exit) {
//do something
}
}
public static void main(String[] args) throws Exception {
ThreadFlag thread = new ThreadFlag();
thread.start();
sleep(5000); // 主執行緒延遲5秒
thread.exit = true; // 終止執行緒thread
thread.join();
System.out.println("執行緒退出!" );
}
}
或者,run方法中如果你不是使用while迴圈處理,則可以隔一段程式碼呼叫一次標誌位判斷:
public class ThreadFlag extends Thread {
public volatile boolean exit = false;
public void run() {
//do something
if (!exit)return;
//do something
if (!exit)return;
//do something
if (!exit)return;
//do something
if (!exit)return;
}
}
2. 使用stop方法強制終止執行緒
使用stop方法可以強行終止正在執行或掛起的執行緒。我們可以使用如下的程式碼來終止執行緒:
thread.stop();
雖然這樣可以終止執行緒,但使用stop方法是很危險的,就象突然關閉計算機電源,而不是按正常程式關機一樣,可能會產生不可預料的結果,因此,並不推薦使用stop方法來終止執行緒。
3. 使用interrupt終止執行緒
使用interrupt方法來終端執行緒可分為兩種情況:
(1)執行緒處於阻塞狀態,如使用了sleep方法。
(2)使用while(!isInterrupted()){……}
來判斷執行緒是否被中斷。
在第一種情況下使用interrupt方法,sleep方法將丟擲一個InterruptedException例外,而在第二種情況下執行緒將直接退出。
第一種情況示例程式碼:
public class ThreadInterrupt extends Thread {
public void run() {
try {
sleep(50000); // 延遲50秒
}
catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}
public static void main(String[] args) throws Exception {
Thread thread = new ThreadInterrupt();
thread.start();
System.out.println("在50秒之內按任意鍵中斷執行緒!");
System.in.read();
thread.interrupt();
thread.join();
System.out.println("執行緒已經退出!");
}
}
執行結果:
在50秒之內按任意鍵中斷執行緒!
sleep interrupted
執行緒已經退出!
在呼叫interrupt方法後, sleep方法丟擲異常,然後輸出錯誤資訊:sleep interrupted.
第二種情況示例程式碼:
public class ThreadInterrupt extends Thread {
public void run() {
while (!isInterrupted()) {
//do something
}
}
public static void main(String[] args) throws Exception {
Thread thread = new ThreadInterrupt();
thread.start();
thread.interrupt();
thread.join();
System.out.println("執行緒已經退出!");
}
}
注意:在Thread類中有兩個方法可以判斷執行緒是否通過interrupt方法被終止。一個是靜態的方法interrupted()
,一個是非靜態的方法isInterrupted()
,這兩個方法的區別是interrupted用來判斷當前線是否被中斷,而isInterrupted
可以用來判斷其他執行緒是否被中斷。因此,while (!isInterrupted())
也可以換成while (!Thread.interrupted())
。
相關推薦
一、多執行緒基礎概念、實現執行緒三種方法、中斷執行緒方法,以及執行緒狀態轉化
1、CPU核心數和執行緒數的關係 1:1的關係,引入超執行緒之後,就是1:2 2、cpu時間輪轉機制,即RR排程 3、程序和執行緒 程序:程式執行資源分配最小單位,程序內部有多個執行緒,多個執行緒之間會共享程序資源 執行緒:CPU排程的最小單位 4、並行和併發
android 終止執行緒幾種方法
其實android 不提倡我們終止執行緒的,以前的一些函式,stop等等都不推薦使用了,但是當我們確實要終止執行緒的時候,可看考下面的問題 有時當一個元件或者activity被destory()的時候要求其啟動的執行緒也一起終止掉,現在就來總結了一下有這有幾種方法:
Java終止執行緒的三種方法
使用標誌位退出執行緒 使用stop方法強制終止執行緒 使用interrupt終止執行緒 1. 使用標誌位退出執行緒 這種也是最常用的方法,就是定義一個boolean型的標誌位,線上程的run方法中根據這個標誌位是true還是false來判斷是否退出,這種
JAVA中執行緒同步的方法(7種)彙總
同步的方法: 一、同步方法 即有synchronized關鍵字修飾的方法。 由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時, 內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。 注: synchronized關鍵字也可以修飾靜態
Java多執行緒3種實現方法
Java中的多執行緒有三種實現方式:1.繼承Thread類,重寫run方法。Thread本質上也是一個實現了Runnable的例項,他代表一個執行緒的例項,並且啟動執行緒的唯一方法就是通過Thread類的start方法。2.實現Runnable介面,並實現該介面的run()
三個執行緒T1,T2,T3.保證順序執行的三種方法
Thread t1 = new Thread(new Runnable() { public void run() { try { Thread.sleep(100
讓網頁中的Java Script程式碼自動執行的三種方法
轉自:開源中國--檸檬酷 整理:Bob 先簡單總結一下,這三種方法分別是: 1、在Java Script程式碼區加這句程式碼:window.onload = myAutoRun(); 2、在body標籤中加屬性onload,加後的樣子是這樣的:<body onLoa
JAVA多執行緒(三) 執行緒池和鎖的深度化
github演示程式碼地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/src/main/java/com/kawa/thread 1.執行緒池 1.1 執行緒池是什麼 Java中的執行緒
Java多執行緒之join()方法
概要 本章,會對Thread中join()方法進行介紹。涉及到的內容包括: 1. join()介紹 2. join()原始碼分析(基於JDK1.7.0_40) 3. join()示例 來源:http://www.cnblogs.com/skywang12345/p/34792
白話理解java多執行緒之join()方法
join字面意思是加入,我理解為插隊. 舉例:媽媽在炒菜,發現沒喲醬油了,讓兒子去打醬油,兒子打完醬油,媽媽炒完菜,全家一起吃 package cn.yh.thread01; /** * * 打醬油的例子 */ public class Demo03 { public stat
java多執行緒三 wait sleep join yield
一,wait 是object類的方法,並不是執行緒的方法,使用此方法會使當前執行緒進入阻塞狀態,過程中執行緒會釋放cpu資源和鎖資源,獻策韓國你進入等待池,可以通過notify或者notifyall將執行緒喚醒,是執行緒重新進入就緒狀態,在wait,notify和notifyall方法使用過程中
執行緒---三種建立方式例項;以及執行緒池的使用
1、繼承Thread類 繼承Thread類,重寫run方法(即要讓執行緒進行的操作), 建立執行緒例項,呼叫start()方法啟動執行緒。 import java.util.Date; /** * @author: ycz * @date: 2018/11/25 0025
Java學習筆記(一) Java多執行緒 synchronized同步方法
1.提出問題-例項變數非執行緒安全 如果多個執行緒同時訪問1個物件的例項變數,則可能出現"非執行緒安全"問題。 1.1 何為非執行緒安全? 我的理解是多個執行緒對一個例項變數操作會出現值被更改,不同步的情況。 1.2 舉例 1.2.1 有私有變數的類HasPr
白話理解java多執行緒中join()方法
join字面意思是加入,我理解為插隊. 舉例:媽媽在炒菜,發現沒喲醬油了,讓兒子去打醬油,兒子打完醬油,媽媽炒完菜,全家一起吃 package cn.yh.thread01; /** * *
Java學習筆記(二) Java多執行緒 synchronized同步方法-防止髒讀
1. 髒讀 在給一個物件賦值的時候進行了同步, 但是在取值的時候可能出現意外,此值已經被其他執行緒修改了,這種情況就是髒讀 1.1 PublicVar類 public class PublicVar { public String userName =
Android/java多執行緒(三)-HandlerThread的使用場景及原始碼解析
HandlerThread是什麼? 點開類楸一眼,這貨是這樣介紹自己的: * Handy class for starting a new thread that has a looper. The looper can then be * used to create h
Java建立執行緒安全的方法
原文連結 譯者:秦建平 校對:方騰飛 首先來看一個問題: 下面這個方法是執行緒安全的嗎?如何才能讓這個方法變成執行緒安全的? public class MyCount { private static int counter = 0; public static int g
Java多執行緒-----Thread常用方法
1.public Thread(Runnable target,String name) 建立一個有名稱的執行緒物件 package com.thread.mothed; public class ThreadMethod {
Java多執行緒—兩種賣票
public class MyThread1 extends Thread{ private int ticket=10; public void run() { for(int i=0;i
Java多執行緒初探——yield()方法與join()方法
一、執行緒與程序 1、程序是程式(任務)執行過程,持有資源(共享記憶體,共享檔案)和執行緒,程序是動態性的,如果程式沒有執行就不算一個程序。 2、執行緒是系統中最小的執行單元,同一程序中有多個執行緒,執行緒共享程序的資源 Java中建立現成的方式就不再贅述了,有兩種:(1