1. 程式人生 > >線程的優先級

線程的優先級

運行 () 定性 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、優先級的隨機性:

  這個就簡單了,上面我介紹過優先級的規則性,優先級越高的線程最先執行完,但是這個規則性並不是絕對的,當兩個線程的優先級比較接近時,誰也不知道哪個線程最先執行完,這也就是線程的隨機性,還有,不要把打印順序當做線程執行完成的標準,這兩個是無關的,看到這裏是不是有些暈了,沒錯,我也暈,不過翻了好多相關的資料,都是這樣講解的。

最後,線程執行完成和打印出語句,他們的關系具有不確定性和隨機性。

線程的優先級