大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 java如何正確停止一個線程

java如何正確停止一個線程

更新時間:2019-10-25 11:38:08 來源:動力節點 瀏覽2485次

 

     如何停止java的線程一直是一個開發多線程程序常遇到的一個問題。也有好多同學問過,所以今天動力節點java培訓機構小編在這里總結一下希望可以讓更多的人知道在java中如何安全的結束一個正在運行的線程。


  在Java的多線程編程中,java.lang.Thread類型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume()。通過這些方法,我們可以對線程進行方便的操作,但是這些方法中,只有start()方法得到了保留。


  那么,我們究竟應該如何停止線程呢?這里我們介紹兩種方法:


  1、使用共享變量的方式


  在這種方式中,之所以引入共享變量,是因為該變量可以被多個執行相同任務的線程用來作為是否中斷的信號,通知中斷線程的執行。


public class ThreadFlag extends Thread 

    public volatile boolean exit = false; 

 

    public void run() 

    { 

        while (!exit); 

    } 

    public static void main(String[] args) throws Exception 

    { 

        ThreadFlag thread = new ThreadFlag(); 

        thread.start(); 

        sleep(3000); // 主線程延遲3秒 

        thread.exit = true;  // 終止線程thread 

        thread.join(); 

        System.out.println("線程退出!"); 

    } 


  在上面代碼中定義了一個退出標志exit,當exit為true時,while循環退出,exit的默認值為false。在定義exit時,使用了一個Java關鍵字volatile,這個關鍵字的目的是使exit同步,也就是說在同一時刻只能由一個線程來修改exit的值。


  建議使用如下的方法來停止線程:


 private volatile Thread blinker; 

    public void stop() { 

        blinker = null; 

    } 

    public void run() { 

        Thread thisThread = Thread.currentThread(); 

        while (blinker == thisThread) { 

            try { 

                thisThread.sleep(interval); 

            } catch (InterruptedException e){ 

            } 

            repaint(); 

        } 

    }

 


  2、使用interrupt方法終止線程


  如果一個線程由于等待某些事件的發生而被阻塞,又該怎樣停止該線程呢?


  這種情況經常會發生,比如當一個線程由于需要等候鍵盤輸入而被阻塞,或者調用Thread.join()方法,或者Thread.sleep()方法,在網絡中調用ServerSocket.accept()方法,或者調用了DatagramSocket.receive()方法時,都有可能導致線程阻塞,使線程處于處于不可運行狀態時,即使主程序中將該線程的共享變量設置為true,但該線程此時根本無法檢查循環標志,當然也就無法立即中斷。


  這里我們給出的建議是,不要使用stop()方法,而是使用Thread提供的interrupt()方法,因為該方法雖然不會中斷一個正在運行的線程,但是它可以使一個被阻塞的線程拋出一個中斷異常,從而使線程提前結束阻塞狀態,退出堵塞代碼。


class MyThread extends Thread {

volatile boolean stop = false;

 

public void run() {

    while (!stop) {

        System.out.println(getName() + " is running");

    try {

        sleep(1000);

    }catch (InterruptedException e) {

        System.out.println("week up from blcok...");

              stop = true; // 在異常處理代碼中修改共享變量的狀態

        }

    }

    System.out.println(getName() + " is exiting...");

    }

}

 

class InterruptThreadDemo3 {

public static void main(String[] args) throws InterruptedException {

      MyThread m1 = new MyThread();

          System.out.println("Starting thread...");

                m1.start();

                Thread.sleep(3000);

          System.out.println("Interrupt thread...: " + m1.getName());

                m1.stop = true; // 設置共享變量為true

                m1.interrupt(); // 阻塞時退出阻塞狀態

                 Thread.sleep(3000); // 主線程休眠3秒以便觀察線程m1的中斷情況

          System.out.println("Stopping application...");

          }

}


  注意:在Thread類中有兩個方法可以判斷線程是否通過interrupt方法被終止。一個是靜態的方法interrupted(),一個是非靜態的方法isInterrupted(),這兩個方法的區別是interrupted用來判斷當前線是否被中斷,而isInterrupted可以用來判斷其他線程是否被中斷。


timg (10).jpg


以上就是動力節點java培訓機構小編介紹的“java如何正確停止一個線程”的內容,希望都大家有幫助,更多java最新資訊請繼續關注動力節點java培訓機構官網,每天會有精彩內容分享與你。


相關視頻教程免費下載


java線程視頻教程:線程基本操作介紹


java多線程視頻教程:守護線程詳解



相關文章推薦


Java多線程你了解多少?


2019最新50道精選Java線程面試題


Java多線程基礎開發詳細教程


最常見的Java線程面試題總結


JAVA多線程實現的四種方式


Java多線程學習,深入解析


常見Java多線程面試題總結


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 大片毛片女女女女女女女 | 天天综合网在线 | 青青青在线视频国产 | 狠狠色噜噜狠狠狠狠2021天天 | 大片刺激免费播放视频 | 午夜视频在线观看国产www | 伊人天伊人天天网综合视频 | s8国产成人精品视频 | 国产成人99久久亚洲综合精品 | 天天射日日干 | 欧美日韩亚洲精品国产色 | 欧美成人aa大片拍拍拍 | 国产成人精品一区二区仙踪林 | 免费看搡女人的视频 | 狠狠操天天爱 | 精品免费看 | 欧美美女一区二区三区 | 亚洲欧洲一区二区三区在线 | 四虎影视免费观看免费观看 | 久久综合一区 | 欧美肥老妇做爰视频 | 久久精品国产在爱久久 | 国产成人亚洲精品91专区手机 | 国产精品永久免费自在线观看 | 国产亚洲欧美日韩综合综合二区 | 亚洲全黄 | 动漫三级在线观看 | 亚洲视频免费在线播放 | 999yy成年在线视频免费看 | 久草综合视频在线 | 亚洲成人在线视频播放 | 国产精品久久久久久久久久日本 | 欧美精品 在线播放 | 狠狠操夜夜爱 | 在线观看国产精品入口 | 美女女女女女女bbbbbb毛片 | 国产天堂视频 | 牛人盗摄一区二区三区视频 | 亚洲国产成人综合精品2020 | 欧美色视频日本片免费高清 | 天天射天天干天天插 |