多線程學習筆記(六)

在操做系統中,線程能夠劃分優先級,優先級較高的線程獲得的CPU資源越多,也就是CPI優先執行優先級較高的線程對象中的任務.dom

設置線程優先級有助於幫線程規劃器肯定在下一次選擇哪個線程來優先執行.ide

設置線程的優先級使用setPriority()方法.測試

在JAVA中,線程的優先級分爲1~10這10個等級,若是小於1或者大於10,JDK會拋出異常 throw new IllegalArgumentException().this

在JDK中使用3個常量來預置定義優先級的值:操作系統

    public final static int MIN_PRIORITY = 1;線程

    public final static int NORM_PRIORITY = 5;對象

    public final static int MAX_PRIORITY = 10;繼承

 

一 .   線程優先級的繼承特性進程

        在JAVA中,線程的優先級具備繼承性, 好比A線程啓動B線程, 則 B線程的優先級與A線程是同樣的資源

        建立兩個線程:

public class SecondThread extends Thread{
            @Override
            public void run(){
                System.out.println("Second Thread priority is : " + this.getPriority());
            }
        }

    

public class FirstThread  extends Thread{
            @Override
            public void run(){
                System.out.println("The First Thread priority is : " + this.getPriority());
                SecondThread secondThread = new SecondThread();
                secondThread.start();
            }
        }

測試調用:  

public class Test {
            public static void main(String[] args) {
                System.out.println("the current Thread priority is : " + Thread.currentThread().getPriority());
                
                Thread.currentThread().setPriority(7);
        
                System.out.println("the current Thread priority is : " + Thread.currentThread().getPriority());
                FirstThread firstThread = new FirstThread();
                firstThread.start();
            
            }
        }

運行結果:

    

當把Thread.currentThread().setPriority(7);註釋後的運行結果:

    

 

 

二 .   優先級具備規則性

        建立高低優先級的線程各一個:

public class HighLever extends Thread {
            @Override
            public void run(){
                long startTime = System.currentTimeMillis();
                long result = 0;
                Random random = new Random();
                result = random.nextInt() + 1;
                long endTime = System.currentTimeMillis();
                System.out.println("high lever thread use time :" + (endTime - startTime));
            }
        }
public class LowLever extends Thread {
            @Override
            public void run(){
                long startTime = System.currentTimeMillis();
                long result = 0;
                Random random = new Random();
                result = random.nextInt() + 1;
                long endTime = System.currentTimeMillis();
                System.out.println("LOW lever thread use time :" + (endTime - startTime));
            }
        }

        運行結果:

        

        優先級高的老是比優先級低的先運行完,可是不是說優先級高的先所有執行完,而且線程的優先級與代碼的執行順序無關,即線程的優先級有必定的規則性,CPU儘可能將執行資源讓給優先級較高的線程執行.

 

三 .   優先級具備隨機性

        將上述代碼中的優先級設置爲相近的

public class Test {
            public static void main(String[] args) {
                for(int i = 0 ; i < 10 ; i ++){
                    HighLever highLever = new HighLever();
                    highLever.setPriority(2);
                    highLever.start();

                    LowLever lowLever = new LowLever();
                    lowLever.setPriority(1);
                    lowLever.start();
                }

            }
        }

        運行結果:

        

        由運行結果能夠了解,優先級高的線程不必定每次都先執行完run()方法中的任務,即線程優先級與執行順序無關,他們的關係具備隨機性.

 

四 .   守護線程

        在JAVA中有兩種線程,用戶線程和守護線程.

        守護線程是一種特殊的線程,當進程中不存在用戶線程時,守護線程自動銷燬,典型的守護線程就是垃圾回收線程,當進程中沒有用戶線程了,則垃圾回收線程也就沒有存在的必要了,自動銷燬.

        守護線程最典型的應用就是垃圾回收(GC).

        建立線程:

public class GuardThread extends Thread {
            @Override
            public void run(){
                int i = 0 ;
                try{
                    while(true){
                        System.out.println("i = " + i++);
                        Thread.sleep(2000);
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }

        測試:

public class Test {
            public static void main(String[] args) {
                try {
                    GuardThread guardThread = new GuardThread();
                    guardThread.setDaemon(true);  //設置守護線程
                    guardThread.start();
                    Thread.sleep(10000);
                    System.out.println("END...........");
                }catch (Exception e){
                    e.printStackTrace();
                }

            }
        }

        運行結果:

        

相關文章
相關標籤/搜索