中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java如何停止線程

發布時間:2021-05-19 09:59:03 來源:億速云 閱讀:107 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關Java如何停止線程的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一、線程停止基礎知識

  • interrupted(): 測試當前線程是否已經中斷。該方法為靜態方法,調用后會返回boolean值。不過調用之后會改變線程的狀態,如果是中斷狀態調用的,調用之后會清除線程的中斷狀態。

  • isInterrupted(): 測試線程是否已經中斷。該方法由對象調用

  • interrupt(): 標記線程為中斷狀態,不過不會中斷正在運行的線程。

  • stop(): 暴力停止線程。已棄用。

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

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

   如下示例:

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("已經是停止狀態了,我要退出了!");
                    throw new InterruptedException();
                }
                System.out.println("i = " + (i+1));
            }

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

Main.java

/**
 * 根據中斷狀態退出for循環
 * @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!");
    }
}

結果如下:
i = 19115
i = 19116
i = 19117
i = 19118
i = 19119
end!

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

Process finished with exit code 0

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

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

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,線程的是否處于停止狀態:" + 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("狀態:"+MyThread.interrupted());
            myThread.interrupt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

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

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

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是做一個中斷標記,當時不會去中斷正在運行的線程,當該線程處于阻塞狀態時就會進行中斷
            //因此,先進行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!");
    }
}

結果:
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()暴力停止

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

  1. 強制讓線程停止有可能使一些請理性的工作得不到完成。

  2. 對鎖定的對象進行了“解鎖”,導致數據得不到同步的處理,出現數據不一致的問題(比如一個方法加上了synchronized,并在其中進行了一個長時間的處理,而在處理結束之前該線程進行了stop(),則未完成的數據將沒有進行到同步的處理)

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

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

備注:建議使用“拋異常”的方法來實現線程的停止,因為在catch塊中還可以將異常向上拋,使線程停止的事件得以傳播

常用的java框架有哪些

1.SpringMVC,Spring Web MVC是一種基于Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架。2.Shiro,Apache Shiro是Java的一個安全框架。3.Mybatis,MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。4.Dubbo,Dubbo是一個分布式服務框架。5.Maven,Maven是個項目管理和構建自動化工具。6.RabbitMQ,RabbitMQ是用Erlang實現的一個高并發高可靠AMQP消息隊列服務器。7.Ehcache,EhCache 是一個純Java的進程內緩存框架。

感謝各位的閱讀!關于“Java如何停止線程”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汽车| 乌兰察布市| 炉霍县| 监利县| 太白县| 沙雅县| 凉山| 和顺县| 德阳市| 清水县| 天水市| 宜章县| 滨州市| 松阳县| 濉溪县| 广灵县| 胶州市| 河东区| 东宁县| 武清区| 大名县| 东辽县| 望谟县| 平遥县| 礼泉县| 当涂县| 衡阳县| 云南省| 宁乡县| 翁源县| 德安县| 郧西县| 莫力| 合川市| 荥阳市| 安义县| 北辰区| 安龙县| 苏尼特左旗| 湘潭市| 尉犁县|