多線程常用的方法

前言:

  1. 上篇博文簡單講解了多線程的三種實現方式: https://blog.csdn.net/zhangyong01245/article/details/100593167
  2. 本篇博文簡單介紹一下 Thread 中常用的方法。

先來看一下線程的狀態[圖片來自網上]:

在這裏插入圖片描述

方法:

以下的方法在Thread 的源碼中均可以查詢到,有興趣的小夥伴可以自行查閱。

  1. start() :使該線程開始執行;Java 虛擬機調用該線程的 run 方法。

  2. run():如果該線程是使用獨立的 Runnable 運行對象構造的,則調用該 Runnable 對象的 run 方法;否則,該方法不執行任何操作並返回。

  3. setName(String name):改變線程名稱,使之與參數 name 相同

  4. setPriority(int piority) 更改線程的優先級【實際使用效果不明顯,有點雞肋】

  5. setDaemon(boolean on) 將該線程標記爲守護線程或用戶線程【true-守護線程,false-用戶線程】

  6. join(long millisec) 等待該線程終止的時間最長爲 millis 毫秒【有無參方法】

  7. interrupt() 線程設置中斷標誌。

  8. isAlive() 測試線程是否處於活動狀態

  9. yield() 作用是讓步,把自己CPU執行的時間讓掉,並和其他線程一起重新競爭CPU【注意有可能是自己再次被執行】

  10. sleep(long millisec) 在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行),此操作受到系統計時器和調度程序精度和準確性的影響

  11. currentThread() 返回對當前正在執行的線程對象的引用

部分方法解釋:

  1. setDaemon()和isDaemon() 用來設置線程是否成爲守護線程和判斷線程是否是守護線程,需要在線程啓動之前進行調用。
    守護線程和用戶線程的區別在於:守護線程依賴於創建它的線程,而用戶線程則不依賴。舉個簡單的例子:如果在main線程中創建了一個守護線程,當main方法運行完畢之後,守護線程也會隨着消亡。而用戶線程則不會,用戶線程會一直運行直到其運行完畢。在JVM中,像垃圾收集器線程就是守護線程,

  2. join(long millisec) 等待該線程終止的時間最長爲 millis 毫秒或者到線程執行結束【無參或者參數爲0會一直等待線程執行結束】,源碼:

   /**
     *  參數值爲0,表示一直等待,知道線程執行結束
     *  不爲0, 等待到線程結束 或者 超時返回
     * @param millis 毫秒
     * @throws InterruptedException
     */
    public final synchronized void join(long millis)
            throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            //  線程是否處於活動狀態
            while (isAlive()) {
                // java原生方法,參數0表示,一直等待線程到結束
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                // java原生方法,參數不爲0表示,一直等待線程到結束,或者到指定delay時間結束
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }
  1. interrupt() 線程設置中斷標誌,一般用於在外部設置該線程的中斷點,結合 interrupted() isInterrupted() 方法結束run 方法。
    需要注意的是 :
    interrupt() :線程設置中斷標誌,並不會結束線程。
    isInterrupted(): 返回調用此方法的線程是否有中斷標誌,不會去除中斷點【注意作用範圍,調用的線程】
    interrupted():是 Thread中的 static 方法,調用方式 Thread.interrupted(),根據其代碼 currentThread().isInterrupted(true); 可知,其返回的是當前線程的中斷狀態。 和isInterrupted()的區別一個是調用者的線程狀態,一個是當前線程的狀態, interrupted() 調用後會返回線程是否有中斷標誌,並且會移除線程的中斷狀態。

注意: 當線程方法wiat、join、sleep三種方法之一,在起作用時,調用它的 interrupte()方法,會生成一個InterruptedException異常,沒有佔用CPU 運行的線程是不可能給自己一箇中斷狀態置位的。

更詳細講解: https://blog.csdn.net/zhangyong01245/article/details/100711341

  1. sleep、wait、notify()、notifyAll()
    sleep 的作用是使當前線程睡眠指定的時間,放棄對CPU的佔用,但是不會放棄對線程以獲取到的鎖
    wait() : 會將當前線程進入休眠狀態,並且釋放當前獲取到的對象鎖,並將當前線程放入到等待池中,等待notify、notifyAll 將其喚醒並進入鎖池中競爭對象鎖,
    notify 從等待池中隨機選擇【和優先級也有關】喚醒其中一個線程,進入到鎖池中等待對象鎖,並執行,其他等待池中線程繼續等待。
    notifyAll 將等待池中所有的線程全部喚醒到鎖池中,然後去競爭對象鎖,
    更詳細講解: https://blog.csdn.net/zhangyong01245/article/details/100746128

END.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章