程序猿學社的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。在實際上的開發過程中,暫時還沒有用到這塊。