【多線程併發編程】七 線程的優先級

程序猿學社的GitHub,歡迎Star
https://github.com/ITfqyd/cxyxs
本文已記錄到github,形成對應專題。

前言

上一篇文章,我們瞭解線程安全的那些事,以及如何去解決線程安全的問題,本文就來聊一聊線程的優先級。

1.線程優先級的概念

在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述

  • 通過查看Thread內的源碼,我們可以知道線程優先級的取值範圍爲1-10,默認是5,值越大,表示搶到時間片的概念越高。但是,並不能保證一定能搶到。
  • 如果沒有在1-10之間,會拋出IllegalArgumentException異常
  • 通過調用setPriority方法,設置線程的優先級(需要在就緒之前設置好)
    案例:
  • 年會抽獎系統,我之前就聽到朋友說過他們公司抽獎的事,通過抽獎名單可以發現,某一個項目組的開發人員中獎忒高。但是,那個小組還是有部分人員沒有中獎,設置中獎概率高,不一定表示你100%能中獎。當然,針對這種行爲,社長表示不贊同。

2.線程優先級小知識

子線程會使用父線程的優先級

public static void main(String[] args) {
        System.out.println(Thread.currentThread().getPriority());
    }

在這裏插入圖片描述

  • getPriority方法獲取線程的優先級
  • 爲什麼是5? 如果我們沒有指定某個線程的優先級,那這個線程的默認的優先級就是5。當然,這句話,也不是絕對的。下面這個demo,就可以推翻這個結論。
 public static void main(String[] args) {
        System.out.println("主線程優先級:"+Thread.currentThread().getPriority());
        //1
        Thread.currentThread().setPriority(1);
        System.out.println("設置主線程的優先級爲1");
        Runnable runnable = new Runnable(){
            @Override
            public void run() {
                System.out.println("程序猿學社:從線程優先級爲"+Thread.currentThread().getPriority());
            }
        };
        Thread thread = new Thread(runnable);
        //2
        //thread.setPriority(10);
        thread.start();
    }

1註釋放開,2註釋
在這裏插入圖片描述

  • 線程的優先級默認爲5,我們把主線程修改爲1後,從線程的優先級也爲1。因此,我們可以下結論。如果從線程優先級不指定的情況下,從現場優先級會跟主線程的優先級一樣。

1註釋放開,2註釋放開
在這裏插入圖片描述

  • 從線程已指定線程的優先級,會以從線程的優先級爲準(就近原則)。

線程內使用線程

package com.cxyxs.thread.seven;

/**
 * Description:
 * 轉發請註明來源  程序猿學社 - https://ithub.blog.csdn.net/
 * Author: 程序猿學社
 * Date:  2020/2/26 12:12
 * Modified By:
 */
public class Demo2 implements  Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"線程優先級爲"+Thread.currentThread().getPriority());

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"線程優先級爲"+Thread.currentThread().getPriority());
            }
        };
        Thread thread = new Thread(runnable,"隔壁老王");
        //thread.setPriority(10);
        thread.start();
    }

    public static void main(String[] args) {
        Demo2 demo2 = new Demo2();
        Thread thread = new Thread(demo2,"程序猿學社");
        thread.setPriority(1);
        thread.start();
    }
}

在這裏插入圖片描述

  • 如果被使用的線程沒有指點優先級,以調用方線程爲準。
  • 被使用線程指定優先級,則以自身優先級爲準(就近原則)。

線程優先級越高,是否優先執行?

package com.cxyxs.thread.seven;

/**
 * Description:驗證優先級高的是否優先執行
 * 轉發請註明來源  程序猿學社 - https://ithub.blog.csdn.net/
 * Author: 程序猿學社
 * Date:  2020/2/26 12:25
 * Modified By:
 */
public class Demo3 implements  Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName()+","+i);
        }
    }

    public static void main(String[] args) {
        Demo3 demo = new Demo3();
        Thread t = new Thread(demo,"程序猿學社");
        Thread t1 = new Thread(demo,"后羿");
        Thread t2 = new Thread(demo,"魯班");
        t.setPriority(1);
        t2.setPriority(10);
        t.start();
        t1.start();
        t2.start();
     }
}

在這裏插入圖片描述
看測試的結果,是真的和符合我們之前提的問題,優先級高的線程先執行

  • 個人看法,不一定,優先級高,只是代表你搶到cpu時間片的概率高。例如,你學習成績好,每次都是第一名,不意味着你每次考試都是N01。在實際上的開發過程中,暫時還沒有用到這塊。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章