1. 程式人生 > >java停止執行緒的幾種方式

java停止執行緒的幾種方式

該學習筆記是學習《java多執行緒程式設計核心技術》高洪巖版本的第一章的學習筆記,在該章節中個人認為比較重要的是如何正確的停止一個執行緒。

停止一個執行緒最重要的是讓執行緒的run方法結束執行於是可以有以下幾種方法:
1.run方法結束完成,則執行緒自然結束
2.retrun將方法返回,則方法自然結束
3.異常將方法中斷掉,這也就是書上所說的異常法
4.使用執行緒的stop方法
第一種方式自然不要多說
第二種方式做的demo,書上說使用多個return會造成汙染

Thread thread = new
Thread(()->{ for (int i = 0; i < 50000; i++) { System.out.println(Thread.currentThread().getName() + "執行到第" + i + "次。"); if(Thread.currentThread().isInterrupted()){ System.out.println(Thread.currentThread().isInterrupted()); return
; } } })
; thread.start(); Thread.sleep(1000); thread.interrupt();

第三種方式是異常法Demo如下

        Thread thread = new Thread(()->{
                try{
                    for (int i = 0; i < 50000; i++) {
                        System.out.println(Thread.currentThread().getName() + "執行到"
+ i + "次。"); if(Thread.currentThread().isInterrupted()){ System.out.println("執行到這裡結束"); throw new RuntimeException("結束終止"); } } }catch (Exception e) { System.out.println("捕獲異常,執行緒停止"); } })
; thread.start(); Thread.currentThread().sleep(1000); thread.interrupt();

第四種是stop方式demo如下,stop方法已被作廢,其原因是有二,其一為stop方法會使一些清理工作得不到完成(?不明白)其二stop方法會釋放鎖,比如執行緒在執行一個同步方法,stop會將執行緒停止並釋放鎖,這是不安全的,應該將資料恢復後停止執行緒

Thread thread = new Thread(()->{
            while(true){
                System.out.println("aaa");
            }
        },"我的執行緒");
        thread.start();
        thread.sleep(1000);
        thread.stop();

其他還有suspend暫停一個執行緒resume啟動一個執行緒,suspend方法會給同步方法加鎖也就是說執行緒在執行一個同步方法是被suspend會給同步方法上鎖,細節:println是一個同步方法
suspend和resume也會導致跟stop一樣的情況這也是為啥被棄用的原因
yield方法當前執行緒放棄執行讓其他執行緒執行,放棄時間不確定
setpriority設定執行緒優先,優先與執行結果不存在必然聯絡,這只是概率的問題
setdaemon設定是否為守護執行緒,也就是設定執行緒伴隨set他的執行緒而存活

有不對的地方忘改正