日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

并发基础(三): java线程优先级小试牛刀

發布時間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并发基础(三): java线程优先级小试牛刀 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、概述

在不同的JVM中(JVM也算是一個操作系統),有著不同的CPU調度算法,對于大部分的JVM來說,優先級也是調度算法中的一個參數。

所以,線程優先級在一定程度上,對線程的調度執行順序有所影響,但不能用于保證線程的執行順序,因為優先級僅僅是其中一個參數而已,其他參數還可能有線程的等待時間、執行時間等。而且操作系統也可抗能可以完全不用理會JAVA線程對于優先級的設定。

線程優先級的范圍一般是1~10默認是5,但也有的JVM不是這個范圍。所以,一般也盡量不要設置優先級為數字,可以使用Thread類的3個靜態字段:

static int MAX_PRIORITY : 線程可以具有的最高優先級。
static int MIN_PRIORITY : 線程可以具有的最低優先級。
static int NORM_PRIORITY : 分配給線程的默認優先級。

同時。對于需要較多CPU時間的線程需要設置較低的優先級,這樣可以確保處理器不會被獨占。

二、實例應用

一直在思考怎么設計,才能用簡單明了的例子來證明優先級對線程的執行順序有影響,最后為了嚴謹,還是不得不用到線程鎖,可能對初學者來說,有點難理解。

不過,思路是很清晰的:就是如何讓10個線程一起同時并發。首先讓創建的10個線程依次進入對象鎖的池中等待,然后當10個線程創建完后,main線程(主線程)同時喚醒這10個線程,于是10個線程同時一起并發競爭CPU,只計算5次,看看線程的結束的先后順序。(注意:之所以線程的執行次數限制在5次,而不是無限,是因為會發生線程饑餓,高優先級線程占用著CPU,導致低優先級的線程無法被調度!!

public class Test2 {//obj對象 用于作為對象鎖static String obj=""; public static void main(String[] args) {//創建十個不同優先級的線程for(int i=1;i<10;i++){Thread t = new Thread(new Task(),"Thread_"+i);t.setPriority(i);//線程啟動,進入就緒隊列t.start();try {//當前線程--main線程 休眠100毫秒,確保線程t已經創建完成,并能運行到等待獲取鎖處Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}synchronized (obj) {//main線程獲取對象鎖后,喚醒等待在該對象池上的所有線程--就是上面創建的10個線程obj.notifyAll();}} }//實現 Runnable接口class Task implements Runnable{@Overridepublic void run() {synchronized (Test2.obj) {try {//在對象Test2.obj上等待,Test2.obj.wait();} catch (InterruptedException e) {e.printStackTrace();}}//線程喚醒后,執行下面的代碼int count=0;//計算5次,不能是while(true),不限制執行次數,否則會發生線程饑餓while(count<5){count++;System.out.println(Thread.currentThread().getName());//每次計算完后,讓出CPU,重新進入就緒隊列,與其他線程一起競爭CPUThread.yield();}System.out.println(Thread.currentThread().getName()+"結束");}}

測試結果:

??從結果可以看出,雖然線程的結束順序不是完全按照優先級高低,但也基本是優先級高的線程結束的較快,被CPU調度的概率越大

Thread_9
Thread_5
Thread_6
Thread_8
Thread_7
Thread_9
Thread_8
Thread_7
Thread_9
Thread_8
Thread_9
Thread_7
Thread_9
Thread_7
Thread_8
Thread_9結束
Thread_8
Thread_7
Thread_8結束
Thread_7結束
Thread_4
Thread_5
Thread_6
Thread_3
Thread_5
Thread_6
Thread_5
Thread_6
Thread_5
Thread_6
Thread_5結束
Thread_6結束
Thread_4
Thread_2
Thread_3
Thread_4
Thread_1
Thread_3
Thread_4
Thread_3
Thread_4
Thread_3
Thread_4結束
Thread_3結束
Thread_2
Thread_1
Thread_2
Thread_1
Thread_2
Thread_1
Thread_2
Thread_1
Thread_1結束
Thread_2結束

文章有不當之處,歡迎指正,你也可以關注我的微信公眾號:好好學java,獲取優質學習資源。

總結

以上是生活随笔為你收集整理的并发基础(三): java线程优先级小试牛刀的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。