Java学习-075-多线程08:线程优先级 Thread.setPriority(Thread.MAX_PRIORITY)
當程序中存在多個任務同時執行時,若多個任務的優先等級不一樣,則可通過設定任務對應的線程優先級,使得對應的任務線程具備高優先級執行。通過 Thread.setPriority(線程優先級) 可以實現。示例代碼如下所示:
package com.fanfengping.demo;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Demo12RunnablePriority implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("{} 運行中 {}", Thread.currentThread().getName(), i);
}
}
public static void main(String[] args) {
Thread threadPriorityA = new Thread(new Demo12RunnablePriority(), "線程 A");
Thread threadPriorityB = new Thread(new Demo12RunnablePriority(), "線程 B");
Thread threadPriorityC = new Thread(new Demo12RunnablePriority(), "線程 C");
/**
* 設定線程的優先級;數值越大,優先級越高,
* 取值范圍 1 - 10,超出范圍會拋 IllegalArgumentException 異常
* 默認優先級為 Thread.NORM_PRIORITY = 5
* 子線程默認父線程的優先級,子線程優先級設定不可大于父線程優先級
* 高優先級線程在執行時,相對其他線程擁有優先權,具體執行時由 CPU 調度確定執行
*/
threadPriorityC.setPriority(Thread.MAX_PRIORITY);
threadPriorityA.setPriority(Thread.MIN_PRIORITY);
threadPriorityA.start();
threadPriorityB.start();
threadPriorityC.start();
}
}
執行程序,輸出內容如下所示:
14:14:50.252 [線程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 C 運行中 0 14:14:50.252 [線程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 A 運行中 0 14:14:50.252 [線程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 B 運行中 0 14:14:50.758 [線程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 B 運行中 1 14:14:50.758 [線程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 C 運行中 1 14:14:50.758 [線程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 A 運行中 1 14:14:51.259 [線程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 A 運行中 2 14:14:51.259 [線程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 C 運行中 2 14:14:51.259 [線程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 B 運行中 2 14:14:51.760 [線程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 B 運行中 3 14:14:51.760 [線程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 C 運行中 3 14:14:51.760 [線程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 A 運行中 3 14:14:52.260 [線程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 A 運行中 4 14:14:52.260 [線程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 C 運行中 4 14:14:52.260 [線程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 線程 B 運行中 4
由程序輸出,可以看出,高優先級線程可能在實際運行中并未完全獲得高優先級的執行權,低優先級的線程也可能被優先執行。因而,線程自身的優先級高低,只是有更大的概率獲得優先執行,但并非完全的優先執行,線程運行的實際優先級(執行先后順序)與 CPU 的調度有直接關系。
關于線程優先級,有如下信息僅供參考(若有錯誤,敬請指正,非常感謝)
Thread.setPriority()用來設定線程的優先級
優先級可以用從1到10的范圍指定。10表示最高優先級(Thread.MAX_PRIORITY),1表示最低優先級(Thread.MIN_PRIORITY),5是普通優先級(Thread.NORM_PRIORITY,默認)
優先級不能超出1-10的取值范圍,否則拋出IllegalArgumentException
在線程 start 方法被調用之前,線程的優先級應該被設定
線程的優先級不能超過所屬線程組的優先級,即可以通過控制線程組的優先級,來控制線程組下線程的最大優先級
線程的優先級未設定時,默認所屬的線程組的優先級
未指定線程優先級時,所有線程都攜帶普通優先級
優先級最高的線程在執行時被給予優先,最終由 CPU 調度程序決定哪一個線程被執行
與線程池中等待運行機會的線程相比,當前正在運行的線程可能總是擁有更高的優先級
不要嘉定高優先級線程一定先于低優先級的線程運行
不要有業務邏輯依賴于線程優先級,結果會無法預期
我本渺小,但山峰,我一次次絕頂!
PS:若有錯誤,敬請告知,不勝感激!
Copyright @范豐平 版權所有,如需轉載請標明本文原始鏈接出處,嚴禁商業用途! 我的個人博客鏈接地址:http://www.cnblogs.com/fengpingfan
總結
以上是生活随笔為你收集整理的Java学习-075-多线程08:线程优先级 Thread.setPriority(Thread.MAX_PRIORITY)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可能是开启了私人模式
- 下一篇: 怎么创建具有真实纹理的CG场景岩石?