Java多線程-線程中止

不正確的線程中止-Stop

Stop:中止線程,并且清除監(jiān)控器鎖的信息,但是可能導致
線程安全問題,JDK不建議用。
Destroy: JDK未實現(xiàn)該方法。

/**
 * @author simon
 */
public class StopThread extends Thread {
    private int i = 0, j = 0;
    @Override
    public void run() {
        synchronized (this) {
            // 增加同步鎖,確保線程安全
            ++i;
            try {
                // 休眠10秒,模擬耗時操作
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            ++j;
        }
    }
    /** * 打印i和j */
    public void print() {
        System.out.println("i=" + i + " j=" + j);
    }
}
/**
 * @author simon
 * 示例3 - 線程stop強制性中止,破壞線程安全的示例
 */
public class Demo {
    public static void main(String[] args) throws InterruptedException {
        StopThread thread = new StopThread();
        thread.start();
        // 休眠1秒,確保i變量自增成功
        Thread.sleep(1000);
        // 暫停線程
        thread.stop(); // 錯誤的終止
        //thread.interrupt(); // @正確終止
        while (thread.isAlive()) {
            // 確保線程已經(jīng)終止
        } // 輸出結果
        thread.print();
    }
}

理想狀態(tài):要么自增成功i=1, j=1,要么自增失敗i=0, j=0
真正程序執(zhí)行結果:i=1, j=0

image

沒有保證同步代碼塊里面數(shù)據(jù)的一致性,破壞了線程安全
stop方法直接停止線程

正確的線程中止-interrupt

如果目標線程在調用Object class的wait()、wait(long)或wait(long, int)方法、join()、join(long, int)或sleep(long, int)方法時被阻塞,那么Interrupt會生效,該線程的中斷狀態(tài)將被清除,拋出InterruptedException異常。

如果目標線程是被I/O或者NIO中的Channel所阻塞,同樣,I/O操作會被中斷或者返回特殊異常值。達到終止線程的目的。

如果以上條件都不滿足,則會設置此線程的中斷狀態(tài)。

對Demo中的示例,stop()改成interrupt()后,最終輸出為"i=1 j=1",數(shù)據(jù)一致。

image

正確的線程中止-標志位

/** 通過狀態(tài)位來判斷 */
public class Demo4 extends Thread {
  public volatile static boolean flag = true;

  public static void main(String[] args) throws InterruptedException {
    new Thread(() -> {
      try {
        while (flag) { // 判斷是否運行
          System.out.println("程序運行中");
          Thread.sleep(1000L);
        }
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }).start();
    // 3秒之后,將狀態(tài)標志改為False,代表不繼續(xù)運行
    Thread.sleep(3000L);
    flag = false;
    System.out.println("程序運行結束");
  }
}

在上方代碼邏輯中,增加一個判斷,用來控制線程執(zhí)行的中止。

image
WechatIMG65.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 本文主要講了java中多線程的使用方法、線程同步、線程數(shù)據(jù)傳遞、線程狀態(tài)及相應的一些線程函數(shù)用法、概述等。 首先講...
    李欣陽閱讀 2,594評論 1 15
  • 一、wait--notify--sleep Object obj = new Object(); obj.wait...
    fe0180bd6eaf閱讀 391評論 0 1
  • 本文主要介紹線程的定義,創(chuàng)建,使用,停止,狀態(tài)圖和常用方法。主要用于概念掃盲和梳理。多進程是指操作系統(tǒng)能同時運行多...
    stoneyang94閱讀 1,237評論 2 5
  • 一、基礎知識:1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機...
    殺小賊閱讀 2,559評論 0 4
  • 相關概念 進程是操作系統(tǒng)管理的,每個進程都擁有自己獨立的內存空間,擁有自己獨立的一整套變量,進程和進程之間不共享內...
    我的襪子都是洞閱讀 505評論 0 4

友情鏈接更多精彩內容