最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java停止線程的四種方法

 更新時間:2021年05月18日 15:45:22   作者:fanrendale  
如何停止java的線程一直是一個困惱我們開發(fā)多線程程序的一個問題嗎,本文主要介紹了詳解Java停止線程的四種方法,感興趣的可以了解一下

一、線程停止基礎(chǔ)知識

  • interrupted(): 測試當前線程是否已經(jīng)中斷。該方法為靜態(tài)方法,調(diào)用后會返回boolean值。不過調(diào)用之后會改變線程的狀態(tài),如果是中斷狀態(tài)調(diào)用的,調(diào)用之后會清除線程的中斷狀態(tài)。
  • isInterrupted(): 測試線程是否已經(jīng)中斷。該方法由對象調(diào)用
  • interrupt(): 標記線程為中斷狀態(tài),不過不會中斷正在運行的線程。
  • stop(): 暴力停止線程。已棄用。

二、停止線程方法1:異常法停止

   線程調(diào)用interrupt()方法后,在線程的run方法中判斷當前對象的interrupted()狀態(tài),如果是中斷狀態(tài)則拋出異常,達到中斷線程的效果。

   如下示例:

MyThread.java

public class MyThread extends Thread {

    @Override
    public void run() {
        try {
            for (int i = 0; i < 500000; i++) {
                if (MyThread.interrupted()){
                    System.out.println("已經(jīng)是停止狀態(tài)了,我要退出了!");
                    throw new InterruptedException();
                }
                System.out.println("i = " + (i+1));
            }

            System.out.println("如果我被輸出了,則代表線程沒有停止");
        } catch (InterruptedException e) {
            System.out.println("在MyThread類中的run方法中被捕獲");
            e.printStackTrace();
        }
    }
}

Main.java

/**
 * 根據(jù)中斷狀態(tài)退出for循環(huán)
 * @Author: xjf
 * @Date: 2019/5/25 13:27
 */
public class Main {

    public static void main(String[] args) {
        try {
            MyThread myThread  = new MyThread();
            myThread.start();
            Thread.sleep(100);
            myThread.interrupt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("end!");
    }
}

結(jié)果如下:
i = 19115
i = 19116
i = 19117
i = 19118
i = 19119
end!

已經(jīng)是停止狀態(tài)了,我要退出了!
在MyThread類中的run方法中被捕獲
java.lang.InterruptedException
 at com.book.interrupt_exit.MyThread.run(MyThread.java:15)

Process finished with exit code 0

三、停止線程方法2:在沉睡中停止

先將線程sleep,然后調(diào)用interrupt標記中斷狀態(tài),interrupt會將阻塞狀態(tài)的線程中斷。會拋出中斷異常,達到停止線程的效果。如下示例:

MyThread.java

public class MyThread extends Thread {

    @Override
    public void run() {
        try {
            System.out.println("run-----------start");
            Thread.sleep(5000);
            System.out.println("run-----------end");
        } catch (InterruptedException e) {
            System.out.println("在沉睡中被停止!進入catch,線程的是否處于停止狀態(tài):" + this.isInterrupted());
            e.printStackTrace();
        }

    }
}

Main.java

public class Main {

    public static void main(String[] args) {
        try {
            MyThread myThread = new MyThread();
            myThread.start();
            Thread.sleep(2000);
            System.out.println("狀態(tài):"+MyThread.interrupted());
            myThread.interrupt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

結(jié)果
run-----------start
狀態(tài):false
java.lang.InterruptedException: sleep interrupted
在沉睡中被停止!進入catch,線程的是否處于停止狀態(tài):false
 at java.lang.Thread.sleep(Native Method)
 at com.book.sleep_interrupt.MyThread.run(MyThread.java:13)

線程先調(diào)用interrupt標記中斷狀態(tài),然后線程再睡眠。會拋出中斷異常,達到停止線程的效果。如下:

MyThread1.java

public class MyThread1 extends Thread {

    @Override
    public void run() {
        try {

            for (int i = 0; i < 100000; i++) {
                System.out.println("i = " + (i+1));
            }
            System.out.println("run begin");
            //interrupt是做一個中斷標記,當時不會去中斷正在運行的線程,當該線程處于阻塞狀態(tài)時就會進行中斷
            //因此,先進行interrupt后,再遇到sleep阻塞時,才會進行中斷
            Thread.sleep(200000);
            System.out.println("run end");

        } catch (InterruptedException e) {
            System.out.println("先停止,再遇到了sleep! 進入catch!");
            e.printStackTrace();
        }
    }
}

Main1.java

public class Main1 {

    public static void main(String[] args) {

        MyThread1 myThread1 = new MyThread1();
        myThread1.start();
        myThread1.interrupt();
        System.out.println("end!");
    }
}

結(jié)果:
i = 99993
i = 99994
i = 99995
i = 99996
i = 99997
i = 99998
i = 99999
i = 100000
run begin

先停止,再遇到了sleep! 進入catch!
java.lang.InterruptedException: sleep interrupted
 at java.lang.Thread.sleep(Native Method)
 at com.book.sleep_interrupt.MyThread1.run(MyThread1.java:19)

四、停止線程方法3:stop()暴力停止

線程調(diào)用stop()方法會被暴力停止,方法已棄用。該方法會有不好的后果:

  1. 強制讓線程停止有可能使一些請理性的工作得不到完成。
  2. 對鎖定的對象進行了“解鎖”,導(dǎo)致數(shù)據(jù)得不到同步的處理,出現(xiàn)數(shù)據(jù)不一致的問題(比如一個方法加上了synchronized,并在其中進行了一個長時間的處理,而在處理結(jié)束之前該線程進行了stop(),則未完成的數(shù)據(jù)將沒有進行到同步的處理)

五、停止線程方法4:使用return停止線程

調(diào)用interrupt標記為中斷狀態(tài)后,在run方法中判斷當前線程狀態(tài),如果為中斷狀態(tài)則return,能達到停止線程的效果。

備注:建議使用“拋異?!钡姆椒▉韺崿F(xiàn)線程的停止,因為在catch塊中還可以將異常向上拋,使線程停止的事件得以傳播

參考:《Java多線程編程核心技術(shù)》

到此這篇關(guān)于詳解Java停止線程的四種方法的文章就介紹到這了,更多相關(guān)Java停止線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java位運算知識點詳解

    Java位運算知識點詳解

    這篇文章給大家分享了關(guān)于Java位運算的相關(guān)知識點內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2018-09-09
  • 使用Mybatis-Plus實現(xiàn)對象屬性自動填充功能

    使用Mybatis-Plus實現(xiàn)對象屬性自動填充功能

    這篇文章主要介紹了如何使用Mybatis-Plus實現(xiàn)對象屬性自動填充功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,感興趣的朋友們下面隨著小編來一起來學(xué)習(xí)吧
    2024-01-01
  • springmvc配置線程池Executor做多線程并發(fā)操作的代碼實例

    springmvc配置線程池Executor做多線程并發(fā)操作的代碼實例

    今天小編就為大家分享一篇關(guān)于springmvc配置線程池Executor做多線程并發(fā)操作的代碼實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 寧可用Lombok也不把成員設(shè)置為public原理解析

    寧可用Lombok也不把成員設(shè)置為public原理解析

    這篇文章主要為大家介紹了寧可用Lombok也不把成員設(shè)置為public原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • maven私服搭建的實現(xiàn)步驟

    maven私服搭建的實現(xiàn)步驟

    本文主要介紹了maven私服搭建的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 模仿mybatis-plus實現(xiàn)rpc調(diào)用

    模仿mybatis-plus實現(xiàn)rpc調(diào)用

    這篇文章主要為大家介紹了模仿mybatis-plus實現(xiàn)rpc調(diào)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Java Agent 動態(tài)修改字節(jié)碼詳情

    Java Agent 動態(tài)修改字節(jié)碼詳情

    這篇文章主要介紹了Java Agent動態(tài)修改字節(jié)碼的相關(guān)資料,需要的朋友可以參考下面文章具體的內(nèi)容
    2021-09-09
  • mybatis Invalid bound statement(not found)排坑記錄

    mybatis Invalid bound statement(not foun

    這篇文章主要介紹了mybatis Invalid bound statement(not found)排坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • JFreeChart折線圖的生成方法

    JFreeChart折線圖的生成方法

    這篇文章主要為大家詳細介紹了JFreeChart折線圖的生成方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • java Object轉(zhuǎn)byte與byte轉(zhuǎn)Object方式

    java Object轉(zhuǎn)byte與byte轉(zhuǎn)Object方式

    這篇文章主要介紹了java Object轉(zhuǎn)byte與byte轉(zhuǎn)Object方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評論

邹平县| 海门市| 崇礼县| 聊城市| 鹤山市| 海丰县| 靖西县| 平江县| 岳阳县| 瑞安市| 敦化市| 磐安县| 金门县| 新邵县| 奉新县| 湘乡市| 新建县| 樟树市| 伊金霍洛旗| 玉树县| 昌都县| 会同县| 循化| 铜川市| 威远县| 武夷山市| 灵丘县| 绥德县| 麻阳| 怀化市| 临城县| 屯门区| 文登市| 南开区| 随州市| 察隅县| 涿鹿县| 满城县| 龙胜| 永定县| 平邑县|