線程的優先級
阿新 • • 發佈:2018-08-25
運行 () 定性 strong 異常 int() 較高的 div and
在操作系統中,線程可以劃分優先級的,優先級較高的線程得到的CPU資源較多。(也就是說比那些優先級比自己低的線程執行速度快)
設置線程的優先級使用setPriority()方法。
在java中,線程的優先級可以分為1-10個等級,小於1或者大於10都會拋出java.lang.IllegalArgumentException異常,默認優先級為5。
優先級的特性:(先列舉出來,下面將一一講解)
1、優先級的繼承性。
2、優先級的規則性。
3、優先級的隨機性。
1、線程優先級的繼承性:
優先級是有機場性的,比如A線程啟動B線程,則B線程的優先級和A線程的優先級是一樣的。
下面看一下設置優先級的例子:
public class Test01 { //優先級的繼承性 public static void main(String[] args) { test01 test01 = new test01(); test01.start(); } public static class test01 extends Thread { @Override public void run() { super.run(); System.out.println("test01線程悠閑級為:" + this.getPriority()); //test02繼承的test01 test02 test02 = new test02(); test02.start(); } } public static class test02 extends Thread { @Override public void run() { super.run(); System.out.println("test02線程悠閑級為:" + this.getPriority()); } } }//打印語句 test01線程悠閑級為:5 test02線程悠閑級為:5 Process finished with exit code 0
使用setPriority()設置線程優先級:
public class Test01 { public static void main(String[] args) { test01 test01 = new test01(); test01.start(); } public static class test01 extends Thread { @Override public void run() { super.run(); System.out.println("test01線程悠閑級為:" + this.getPriority()); test02 test02 = new test02(); //自定義test02優先級 test02.setPriority(8); test02.start(); } } public static class test02 extends Thread { @Override public void run() { super.run(); System.out.println("test02線程悠閑級為:" + this.getPriority()); } } } //打印語句 test01線程悠閑級為:5 test02線程悠閑級為:8
2、優先級的規則性
CPU將盡量把執行資源給優先級越高的線程,看一下優先級不一樣的線程執行結果怎麽樣:
public class Test01 { public static void main(String[] args) { //在啟動之前分別設置兩個線程的優先級 test01 test01 = new test01(); test01.setPriority(10); test01.start(); test02 test02 = new test02(); test02.setPriority(1); test02.start(); } public static class test01 extends Thread { @Override public void run() { super.run(); long beginTime = System.currentTimeMillis(); long add = 0; for (int i = 0; i < 5000000; i++) { i++; Random random = new Random(); random.nextInt(); add = add + 1; } long endTime = System.currentTimeMillis(); System.out.println("test01運行時間為:" + (endTime - beginTime) + "毫秒!"); } } public static class test02 extends Thread { @Override public void run() { super.run(); long beginTime = System.currentTimeMillis(); long add = 0; for (int i = 0; i < 5000000; i++) { i++; Random random = new Random(); random.nextInt(); add = add + 1; } long endTime = System.currentTimeMillis(); System.out.println("test02運行時間為:" + (endTime - beginTime) + "毫秒!"); } } } //打印語句 test01運行時間為:297毫秒! test02運行時間為:313毫秒! Process finished with exit code 0
3、優先級的隨機性:
這個就簡單了,上面我介紹過優先級的規則性,優先級越高的線程最先執行完,但是這個規則性並不是絕對的,當兩個線程的優先級比較接近時,誰也不知道哪個線程最先執行完,這也就是線程的隨機性,還有,不要把打印順序當做線程執行完成的標準,這兩個是無關的,看到這裏是不是有些暈了,沒錯,我也暈,不過翻了好多相關的資料,都是這樣講解的。
最後,線程執行完成和打印出語句,他們的關系具有不確定性和隨機性。
線程的優先級