1. 程式人生 > >java多執行緒--優先順序

java多執行緒--優先順序

1. 執行緒優先順序的介紹

java 中的執行緒優先順序的範圍是1~10,預設的優先順序是5。“高優先順序執行緒”會優先於“低優先順序執行緒”執行。

java 中有兩種執行緒:使用者執行緒守護執行緒。可以通過isDaemon()方法來區別它們:如果返回false,則說明該執行緒是“使用者執行緒”;否則就是“守護執行緒”。
使用者執行緒一般使用者執行使用者級任務,而守護執行緒也就是“後臺執行緒”,一般用來執行後臺任務。需要注意的是:Java虛擬機器在“使用者執行緒”都結束後會後退出。

JDK 中關於執行緒優先順序和守護執行緒的介紹如下:

大致意思是:

每個執行緒都有一個優先順序。“高優先順序執行緒”會優先於“低優先順序執行緒”執行。每個執行緒都可以被標記為一個守護程序或非守護程序。在一些執行的主執行緒中建立新的子執行緒時,子執行緒的優先順序被設定為等於“建立它的主執行緒的優先順序”,當且僅當“建立它的主執行緒是守護執行緒”時“子執行緒才會是守護執行緒”。

當Java虛擬機器啟動時,通常有一個單一的非守護執行緒(該執行緒通過是通過main()方法啟動)。JVM會一直執行直到下面的任意一個條件發生,JVM就會終止執行:
(
01) 呼叫了exit()方法,並且exit()有許可權被正常執行。 (02) 所有的“非守護執行緒”都死了(即JVM中僅僅只有“守護執行緒”)。 每一個執行緒都被標記為“守護執行緒”或“使用者執行緒”。當只有守護執行緒執行時,JVM會自動退出。

2. 執行緒優先順序的示例

我們先看看優先順序的示例

class MyThread extends Thread{  
    public MyThread(String name) {
        super(name);
    }

    public void run(){
        for (int i=0; i<5; i++) {
            System.out.println(Thread.currentThread().getName()
                    +"("+Thread.currentThread().getPriority()+ ")"
                    +", loop "+i);
        }
    } 
}; 

public class Demo {  
    public static void main(String[] args) {  

        System.out.println(Thread.currentThread().getName()
                +"("+Thread.currentThread().getPriority()+ ")");

        Thread t1=new MyThread("t1");    // 新建t1
        Thread t2=new MyThread("t2");    // 新建t2
        t1.setPriority(1);                // 設定t1的優先順序為1
        t2.setPriority(10);                // 設定t2的優先順序為10
        t1.start();                        // 啟動t1
        t2.start();                        // 啟動t2
    }  
}
 執行結果
main(5)
t1(1), loop 0
t2(10), loop 0
t1(1), loop 1
t2(10), loop 1
t1(1), loop 2
t2(10), loop 2
t1(1), loop 3
t2(10), loop 3
t1(1), loop 4
t2(10), loop 4

結果說明
(01) 主執行緒main的優先順序是5。
(02) t1的優先順序被設為1,而t2的優先順序被設為10。cpu在執行t1和t2的時候,根據時間片輪循排程,所以能夠併發執行。

3. 守護執行緒的示例

下面是守護執行緒的示例。

// Demo.java
class MyThread extends Thread{  
    public MyThread(String name) {
        super(name);
    }

    public void run(){
        try {
            for (int i=0; i<5; i++) {
                Thread.sleep(3);
                System.out.println(this.getName() +"(isDaemon="+this.isDaemon()+ ")" +", loop "+i);
            }
        } catch (InterruptedException e) {
        }
    } 
}; 

class MyDaemon extends Thread{  
    public MyDaemon(String name) {
        super(name);
    }

    public void run(){
        try {
            for (int i=0; i<10000; i++) {
                Thread.sleep(1);
                System.out.println(this.getName() +"(isDaemon="+this.isDaemon()+ ")" +", loop "+i);
            }
        } catch (InterruptedException e) {
        }
    } 
}
public class Demo {  
    public static void main(String[] args) {  

        System.out.println(Thread.currentThread().getName()
                +"(isDaemon="+Thread.currentThread().isDaemon()+ ")");

        Thread t1=new MyThread("t1");    // 新建t1
        Thread t2=new MyDaemon("t2");    // 新建t2
        t2.setDaemon(true);                // 設定t2為守護執行緒
        t1.start();                        // 啟動t1
        t2.start();                        // 啟動t2
    }  
}

執行結果

main(isDaemon=false)
t2(isDaemon=true), loop 0
t2(isDaemon=true), loop 1
t1(isDaemon=false), loop 0
t2(isDaemon=true), loop 2
t2(isDaemon=true), loop 3
t1(isDaemon=false), loop 1
t2(isDaemon=true), loop 4
t2(isDaemon=true), loop 5
t2(isDaemon=true), loop 6
t1(isDaemon=false), loop 2
t2(isDaemon=true), loop 7
t2(isDaemon=true), loop 8
t2(isDaemon=true), loop 9
t1(isDaemon=false), loop 3
t2(isDaemon=true), loop 10
t2(isDaemon=true), loop 11
t1(isDaemon=false), loop 4
t2(isDaemon=true), loop 12

結果說明
(01) 主執行緒main是使用者執行緒,它建立的子執行緒t1也是使用者執行緒。
(02) t2是守護執行緒。在“主執行緒main”和“子執行緒t1”(它們都是使用者執行緒)執行完畢,只剩t2這個守護執行緒的時候,JVM自動退出。

附:什麼是守護執行緒

守護執行緒並非虛擬機器內部可以提供,使用者也可以自行的設定守護執行緒,方法:public final void setDaemon(boolean on) ;但是有幾點需要注意:

1)、thread.setDaemon(true)必須在thread.start()之前設定,否則會跑出一個IllegalThreadStateException異常。你不能把正在執行的常規執行緒設定為守護執行緒。  (備註:這點與守護程序有著明顯的區別,守護程序是建立後,讓程序擺脫原會話的控制+讓程序擺脫原程序組的控制+讓程序擺脫原控制終端的控制;所以說寄託於虛擬機器的語言機制跟系統級語言有著本質上面的區別)

2)、 在Daemon執行緒中產生的新執行緒也是Daemon的。  (這一點又是有著本質的區別了:守護程序fork()出來的子程序不再是守護程序,儘管它把父程序的程序相關資訊複製過去了,但是子程序的程序的父程序不是init程序,所謂的守護程序本質上說就是“父程序掛掉,init收養,然後檔案0,1,2都是/dev/null,當前目錄到/”)

3)、不是所有的應用都可以分配給Daemon執行緒來進行服務,比如讀寫操作或者計算邏輯。因為在Daemon Thread還沒來的及進行操作時,虛擬機器可能已經退出了。

舉個例子,web伺服器中的Servlet,容器啟動時後臺初始化一個服務執行緒,即排程執行緒,負責處理http請求,然後每個請求過來排程執行緒從執行緒池中取出一個工作者執行緒來處理該請求,從而實現併發控制的目的。

網上摘的一個圖,方便大家理解:

 



相關推薦

java執行--優先順序

1. 執行緒優先順序的介紹 java 中的執行緒優先順序的範圍是1~10,預設的優先順序是5。“高優先順序執行緒”會優先於“低優先順序執行緒”執行。 java 中有兩種執行緒:使用者執行緒和守護執行緒。可以通過isDaemon()方法來區別它們:如果返回false,則說明該

Java執行優先順序

執行緒的優先順序將該執行緒的重要性傳遞給排程器。儘管CPU處理現有執行緒集的順序是不確定的,但是排程器將傾向於讓優先權最高的執行緒先執行。 你可以用getPriority()來讀取現有執行緒的優先順序,並且在任何時刻都可以通過setPriority()來修改優

Java執行——執行優先順序與守護執行(Daemon Thread)

一、執行緒優先順序 每個執行緒都可以通過thread.setPriority()實現程序優先順序的設定。可設定的範圍在1-10之間,如果超過此範圍將丟擲異常throw new IllegalArgumentException()。每個執行緒的預設優先順序為5。 tips:即使將某個執行緒的優

Java執行程式設計核心技術】第一章(執行技能 執行優先順序)

1.8 執行緒的優先順序  在作業系統中,執行緒可以劃分優先順序,優先順序較高的執行緒得到的cpu的資源較多,也就是cpu優先執行優先順序較高的執行緒物件中的任務.  在Java中,執行緒優先順序分為1~10個等級,如果小於1大於10,則JDK丟擲異常,原始碼如下:

java執行程式設計之優先順序

高優先順序的執行緒總是大部分先執行完,但是不是所有的先執行完。先執行完也不是因為先呼叫,如果更改優先順序,先執行完和和程式碼的呼叫順序無關。 優先順序具有一定的規則性,CPU總是儘量將執行資源讓給優先順序比較高的執行緒 優先順序較高的執行緒不一定每一次都先執行完 package com.

三、JAVA執行:Thread API詳細介紹 (sleep、Interrupt、Join、TimeUnit、yield、interrupted、執行優先順序

 本章深入分析了Thread的所有API,熟練掌握Thread的API是學好Thread的前提。   執行緒sleep sleep是一個靜態方法,一共有兩個過載方法,一個需要傳入毫秒數,另一個既要傳入毫秒數又要傳入納秒數。   sleep方法介紹

java執行:5、Java執行的支援(二)執行優先順序

一、執行緒優先順序 在java當中,每一個執行緒都有一個優先順序,我們可以通過Thread當中的getPriority()方法、setPriority方法去得到一個執行緒的優先順序和設定一個執行緒的優先順序。  設定執行緒優先順序,它的引數是一個整形。最小為1(Thread.M

(八) Java執行詳解之阻塞佇列BlockingQueue及佇列優先順序詳解

阻塞佇列 阻塞佇列與普通佇列的區別在於當佇列是空時從佇列中獲取元素的操作將會被阻塞,或者當佇列是滿時往佇列裡新增元素的操作會被阻塞。試圖從空的阻塞佇列中獲取元素的執行緒將會被阻塞,直到其他的執行緒往空的佇列插入新的元素,同樣試圖往已滿的阻塞佇列中新增新元素的執

Java 執行 執行優先順序

每個執行緒都有一個優先順序,高優先順序執行緒的執行優先於低優先順序執行緒。(優先並不代表執行順序,後面會【解釋】) 在一個執行緒中開啟另外一個新執行緒,則新開執行緒稱為該執行緒的子執行緒

Java執行優先順序setPriority

在作業系統中,執行緒可以劃分優先順序,優先順序較高的執行緒得到CPU資源較多,也就是CPU優先執行優先順序較高的執行緒物件中的任務(其實並不是這樣)。 在Java中,執行緒的優先順序用setPrior

java 執行管理執行任務,根據優先順序執行 任務超時管理 執行同步執行管理

需求 需要根據優先順序執行任務,有任務不是特別重要,可以稍後執行;需要對正在執行的執行緒做超時監控;有的API依賴任務返回結果,執行緒池執行的時候任務也支援同步任務; 簡單測試 建立一個使用支援優先順序佇列(new PriorityBlockingQu

java執行執行優先順序

在作業系統中,執行緒可以劃分優先順序,優先順序較高的執行緒得到CPU資源較多,也就是CPU優先執行優先順序較高的執行緒物件中的任務(其實並不是這樣)。 在java中,執行緒的優先順序用setPrior

Java 執行基礎(十一)執行優先順序和守護執行

 Java 多執行緒基礎(十一)執行緒優先順序和守護執行緒 一、執行緒優先順序 Java 提供了一個執行緒排程器來監控程式啟動後進去就緒狀態的所有執行緒。執行緒排程器通過執行緒的優先順序來決定排程哪些執行緒執行。一般來說,Java的執行緒排程器採用時間片輪轉演算法使多個執行緒輪轉獲得CPU的時間片。

Java執行實現電影院售票案例

某電影院目前正在上映賀歲大片,共有100張票,而它有3個售票視窗,請設計一個程式模擬該電影院售票。 定義Sell類實現Runnable介面,很好的解決了單繼承共享資源問題 public class Sell implements Runnable { // 定義100張票,三個售票

java執行物件鎖、類鎖、同步機制詳解

1.在java多執行緒程式設計中物件鎖、類鎖、同步機制synchronized詳解:     物件鎖:在java中每個物件都有一個唯一的鎖,物件鎖用於物件例項方法或者一個物件例項上面的。     類鎖:是用於一個類靜態方法或者class物件的,一個

Java 執行實現死鎖場景

簡述: 《Java 程式設計思想》  P718 ~ P722 模擬死鎖的場景, 三個人 三根筷子,每個人需要拿到身邊的兩根筷子才能開始吃飯 出現死鎖的場景是,三個人都拿到了右邊的筷子,但是由於筷子都被搶佔,均無法獲得左邊的筷子 Chopstick.java

Java 執行 join和interrupt 方法

簡述: 使用Java多執行緒中join和interrupt函式 《Java程式設計思想》 P669 ~ P670 一個執行緒可以再其他執行緒上呼叫join()方法,其效果是等待一段時間直到第二個執行緒結束才繼續執行。 如果某個執行緒在另一個執行緒t上呼叫t.join(), 此

Java 執行 CountDownLatch 試用

簡述: 使用Java多執行緒的庫,包括 ExecutorService執行緒池, CountDownLatch執行緒執行控制(知道所有啟動的執行緒呼叫完成後,函式才會繼續執行) package test.anialy.multithread; import java.ut

Java執行中Synchronized簡介和Static Synchronized的區別

在進行Java開發時,多執行緒的開發是經常會使用的。首先會問一個小問題啊,在Java中有幾種方法可以建立一個執行緒? 我給的答案是3種。(如果還有其他的請留言告訴我哈。) 1、建立直接繼承自Thread類建立執行緒子類。   步驟如下:a 定義一個子類,同時

Java執行學習與總結(Join)

join()方法的用法: join()是主執行緒 等待子執行緒的終止。也就是在子執行緒呼叫了 join() 方法後面的程式碼,只有等到子執行緒結束了才能執行。 例子如下: Java程式碼 p