1. 程式人生 > >JAVA執行緒-Thread類的方法

JAVA執行緒-Thread類的方法

常用方法

static Thread currentThread() 返回對當前正在執行的執行緒物件的引用。
long getId()返回該執行緒的識別符號。
String getName()返回該執行緒的名稱。
int getPriority() 返回執行緒的優先順序。
void interrupt() 中斷執行緒。
boolean isAlive()測試執行緒是否處於活動狀態。
void join()等待該執行緒終止。
void join(long millis)等待該執行緒終止的時間最長為 millis 毫秒。
void join(long millis, int nanos)等待該執行緒終止的時間最長為 millis 毫秒 + nanos 納秒。
void setDaemon(boolean on)將該執行緒標記為守護執行緒或使用者執行緒。
void setPriority(int newPriority)更改執行緒的優先順序。
static void sleep(long millis)在指定的毫秒數內讓當前正在執行的執行緒休眠(暫停執行),此操作受到系統計時器和排程程式精度和準確性的影響。
static void sleep(long millis, int nanos)在指定的毫秒數加指定的納秒數內讓當前正在執行的執行緒休眠(暫停執行),此操作受到系統計時器和排程程式精度和準確性的影響。
void start() 使該執行緒開始執行;Java 虛擬機器呼叫該執行緒的 run 方法。
static void yield()暫停當前正在執行的執行緒物件,並執行其他執行緒。

join

當某個程式執行流中呼叫其他執行緒的join()方法時,呼叫執行緒將被阻塞,直到被join()方法加入的join執行緒執行完為止。

public class Test {
    public static void main(String[] args) {
        Thread thread = new MyRunner3();
        thread.start();
        try {
            //主執行緒等待thread的業務處理完了之後再向下執行  
            //thread和主執行緒合併了  
            thread.join();
        } catch
(InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for(int i = 0; i < 100; i++){ System.out.println("main : " + i); } } } class MyRunner3 extends Thread { @Override public void run() { for
(int i = 0; i < 5; i++){ System.out.println("i am " + getName()); try { sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

sleep-執行緒睡眠

如果需要讓當前正在執行的執行緒暫停一段時間,並進入阻塞狀態,則可以通過呼叫Thread類的靜態sleep()方法來實現。

噹噹前執行緒呼叫sleep()方法進入阻塞狀態後,在其睡眠時間內,該執行緒不會獲得執行機會,即使系統中沒有其他可執行執行緒,處於sleep()中的執行緒也不會執行,因此sleep()方法常用來暫停程式的執行

yield-執行緒讓步

yield()方法和sleep()方法有點相似,它也是Thread類提供的一個靜態方法,它也可以讓當前正在執行的執行緒暫停,但它不會阻塞該執行緒,它只是將該執行緒轉入到就緒狀態。即讓當前執行緒暫停一下,讓系統的執行緒排程器重新排程一次,完全可能的情況是:當某個執行緒呼叫了yield()方法暫停之後,執行緒排程器又將其排程出來重新執行。

實際上,當某個執行緒呼叫了yield()方法之後,只有優先順序與當前執行緒相同或者比當前執行緒更高的處於就緒狀態的執行緒才會獲得執行機會。

sleep()與yield()方法區別:

1、sleep()方法暫停當前執行緒後,會給其他執行緒執行機會,不會理會其他執行緒的優先順序;但yield()方法只會給優先順序高或者相同的執行緒機會

2、sleep()方法會將執行緒轉入到阻塞狀態,知道經過阻塞時間才會轉入就緒狀態;而yield()不會將執行緒轉入阻塞狀態,它只是強制當前執行緒進入就緒狀態。因此完全有可能某個執行緒呼叫了yield()方法暫停之後,立即再次獲取處理器資源被執行。

3、sleep()方法宣告丟擲InterruptedException異常,所以嗲用sleep()方法時要麼捕捉該異常,要麼顯示宣告丟擲該異常;而yield()方法則沒有宣告丟擲任何異常。

4、sleep()方法比yield()方法更好的可移植性,通常不建議使用yield()方法來控制併發執行緒執行。

isAlive

public class Test {
    public static void main(String args[]) throws IllegalThreadStateException {
        MyThread m = new MyThread();  //例項化Runnable子類物件
        Thread t = new Thread(m, "自定義執行緒");
        System.out.println("執行緒執行前:" + t.isAlive());       //false
        t.start();
        //isAlive(),判斷執行緒是否處於活動狀態
        System.out.println("執行緒啟動之後:" + t.isAlive());  //true
    }
}

class MyThread implements Runnable  //實現Runnable介面
{
    public void run() {  //覆寫run 方法
//currentThread().getName()取得當前正在執行的執行緒的名稱        System.out.println(Thread.currentThread().getName() + "執行");
    }
}

執行緒的優先順序

執行緒的優先順序用數字表示,範圍從1到10,預設的是為5
每個執行緒預設的優先順序與建立它的父執行緒的優先順序相同
優先順序越高的執行緒,被執行的順序就比較靠前,在Thread中存在三個常量:MAX_PRIORITY、

MIN_PRIORITY、NORM_PRIORITY

class MyThread implements Runnable  //實現Runnable介面
{
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}

public class Test {
    public static void main(String args[]) {
        Thread t1 = new Thread(new MyThread(), "執行緒A");
        Thread t2 = new Thread(new MyThread(), "執行緒B");
        Thread t3 = new Thread(new MyThread(), "執行緒C");
        t1.setPriority(Thread.MAX_PRIORITY);
        t2.setPriority(Thread.NORM_PRIORITY);
        t3.setPriority(Thread.MIN_PRIORITY);
        t1.start();
        t2.start();
        t3.start();
    }
}

後臺執行緒

在Java程式中,只要前臺有一個執行緒在執行,則整個Java程序都不會消失,所以此時可以設定一個後臺執行緒,這樣即使Java程序結束了,此後臺執行緒依然會執行。要想實現這樣的操作,直接使用setDaemon()方法即可。

class MyThread implements Runnable{ // 實現Runnable介面
    public void run(){  // 覆寫run()方法
        while(true){
            System.out.println(Thread.currentThread().getName() + "在執行。") ;
        }
    }
};
public class Test{
    public static void main(String args[]){
        MyThread mt = new MyThread() ;  // 例項化Runnable子類物件
        Thread t = new Thread(mt,"執行緒");     // 例項化Thread物件
        t.setDaemon(true) ; // 此執行緒在後臺執行
        t.start() ; // 啟動執行緒
    }
};

執行緒的中斷

一個執行緒可以被另一個執行緒中斷其操作的狀態,使用interrupt()方法。

class MyThread implements Runnable  //實現Runnable介面
{
    public void run() {  //覆寫run 方法

        try {
            //sleep方法會出現異常
            System.out.println("1、進入run方法");
            Thread.sleep(6000);     //程式會暫停1000毫秒再執行
            System.out.println("2、已經完成了休眠");
        } catch (InterruptedException e) {
            System.out.println("3、休眠被終止!");
            return;     //返回方法呼叫處


        }
        System.out.println("4、run方法正常結束");
    }
}

public class Test {
    public static void main(String args[]) {
        MyThread m = new MyThread();  //例項化Runnable子類物件
        Thread t = new Thread(m, "自定義執行緒");
        t.start();
        try {
            //sleep方法會出現異常
            Thread.sleep(100);
        } catch (InterruptedException e) {
        }

        t.interrupt();
    }
}

終止執行緒

有三種方法可以使終止執行緒。
1. 使用退出標誌,使執行緒正常退出,也就是當run方法完成後執行緒終止。
2. 使用stop方法強行終止執行緒(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發生不可預料的結果)。
3. 使用interrupt方法中斷執行緒。