1.1.3 線程中止

不正確的線程中止--Stop

Stop: 中止線程,并且清除監(jiān)控鎖的信息,但是可能導(dǎo)致線程安全問題,JDK不建議使用。

Destroy: JDK未實(shí)現(xiàn)該方法。

public class Demo3 {

    public static void main(String[] args) {
        StopThread thread = new StopThread();
        thread.start();
        thread.stop();
        while (thread.isAlive()){
        }
        thread.print();
    }
}

class StopThread extends Thread{
    private int i = 0,j = 0;
    public void run(){
        ++i;
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        ++j;
    }

    public void print(){
        System.out.println("i = " + i +", j =" + j);
    }
}

理想輸出:i = 0 , j =0

程序執(zhí)行結(jié)果: i = 1, j =0

得出結(jié)論: 沒有保證同步代碼塊里面數(shù)據(jù)的一致性,破壞了線程安全。

正確的線程中止--interrupt

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

如果目標(biāo)線程是被I/O或者NIO中的Channel所阻塞,同樣,I/O操作會(huì)被中斷或者返回特殊異常值。達(dá)到中止線程的目的。

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

對(duì)面上述的示例,將stop改為interrupt后,最終輸出為“i =1, j =1",數(shù)據(jù)一致。

正確的線程中止--標(biāo)志位

代碼邏輯中,添加一個(gè)判斷,用來控制線程執(zhí)行的中止。

public class Demo4 {
    public volatile static boolean flag = true;

    public static void main(String[] args) throws InterruptedException {
        new Thread(()->{
            try {
                while (flag){
                    System.out.println("線程正在運(yùn)行");
                    Thread.sleep(1000L);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        Thread.sleep(3000L);
        flag = false;
        System.out.println("程序運(yùn)行結(jié)束");
    }

程序運(yùn)行結(jié)果:

線程正在運(yùn)行
線程正在運(yùn)行
線程正在運(yùn)行
程序運(yùn)行結(jié)束

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

相關(guān)閱讀更多精彩內(nèi)容

  • 一、wait--notify--sleep Object obj = new Object(); obj.wait...
    fe0180bd6eaf閱讀 392評(píng)論 0 1
  • 本文主要講了java中多線程的使用方法、線程同步、線程數(shù)據(jù)傳遞、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等。 首先講...
    李欣陽(yáng)閱讀 2,602評(píng)論 1 15
  • 相關(guān)概念 進(jìn)程是操作系統(tǒng)管理的,每個(gè)進(jìn)程都擁有自己獨(dú)立的內(nèi)存空間,擁有自己獨(dú)立的一整套變量,進(jìn)程和進(jìn)程之間不共享內(nèi)...
    我的襪子都是洞閱讀 512評(píng)論 0 4
  • 本文主要介紹線程的定義,創(chuàng)建,使用,停止,狀態(tài)圖和常用方法。主要用于概念掃盲和梳理。多進(jìn)程是指操作系統(tǒng)能同時(shí)運(yùn)行多...
    stoneyang94閱讀 1,245評(píng)論 2 5
  • 一、認(rèn)識(shí)多任務(wù)、多進(jìn)程、單線程、多線程 要認(rèn)識(shí)多線程就要從操作系統(tǒng)的原理說起。 以前古老的DOS操作系統(tǒng)(V 6....
    GT921閱讀 1,101評(píng)論 0 3

友情鏈接更多精彩內(nèi)容