1. 程式人生 > >Java終止執行緒的三種方法

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