1. 程式人生 > >【Java多執行緒併發總結】Thread類的常用方法(join、yield等)---執行緒的基礎操作篇

【Java多執行緒併發總結】Thread類的常用方法(join、yield等)---執行緒的基礎操作篇

 啟動(start) 

 最基本的操作,呼叫Runnable中的run方法,無返回值。

new Thread(new Test()).start();

休眠(sleep)

 使當前執行緒休眠一段時間,預設為毫秒級,最高可以精確到納秒,呼叫的方法為sleep(long millis, int nanos)。

 public void run() {
        try {
            Thread.sleep(1000);  //休眠1000ms=1s
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

當前執行緒(currentThread) 

 返回當前執行緒的例項。

Thread thread=Thread.currentThread();

join

等待當前執行緒終止,可以設定等待時間,當超過等待時間時放棄等待。

public class Main {
    public static void main(String[] args){
        Thread thread1=new Thread(new Test());
        Thread thread2=new Thread(new Test());
        thread1.start();
        try {
            thread1.join();    //此時等待thread1執行
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread2.start();    //當thread1執行完畢後執行
    }
}

設定優先順序(setPriority)

 設定當前執行緒的優先順序,優先順序分三個等級最低優先順序MIN_PRIORITY、預設優先順序NORM_PRIORITY、最高優先順序MAX_PRIORITY

注意:這僅僅只是給系統一個暗示,並不能確保什麼

thread.setPriority(Thread.MIN_PRIORITY);

 讓步(yield)

 暫停當前執行緒,執行其他執行緒。

注意:這僅僅只是給系統一個暗示,它告訴系統我已經執行完我最重要部分,系統可以去把主要資源用於其他的執行緒,但是不能確定系統一定會答應,也不能確定系統什麼時候答應,所以我們在處理多執行緒的複雜操作時不應該依賴於yield。

Thread.yield();

設為後臺程序(setDaemon)

後臺程序執行在後臺,獨立於整個系統,當系統程序結束,也就是隻剩下後臺程序時,後臺程序退出。

thread.setDaemon(true);

 中斷(interrupt) 

中斷執行緒。

注意:它經常會因為它的名字被誤用,它雖然叫中斷,但是並不會中斷執行緒,實際上stop()方法有中斷執行緒的作用,現在stop已經嗝屁了,因為它的不安全性被java廢除,當然interrupt不能重蹈stop的覆轍,所以它只是給執行緒打上一個interrupt標記,通過Thread.interrupted可以獲取其中斷狀態,我們可以通過這個標記對當前執行緒進行處理。

如果當前執行緒沒有中斷它自己,則該執行緒的 checkAccess 方法就會被呼叫,這可能丟擲 SecurityException。

如果執行緒在呼叫wait() 方法,或者該類的join()、sleep()方法過程中受阻,則丟擲 InterruptedException。

如果該執行緒在可中斷的通道上的 I/O 操作中受阻,則該通道將被關閉,該執行緒的中斷狀態將被設定並且該執行緒將收到一個 ClosedByInterruptException。

如果該執行緒在一個 Selector 中受阻,則該執行緒的中斷狀態將被設定,它將立即從選擇操作返回,並可能帶有一個非零值,就好像呼叫了選擇器的 wakeup 方法一樣。

public class Test implements Runnable{
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
            System.out.println("執行緒中斷");
            return;
        }
    }
}
public class Main {
    public static void main(String[] args){
       Thread thread=new Thread(new RunTest());
        thread.start();
        thread.interrupt();
    }
}

 執行結果

java.lang.InterruptedException: sleep interrupted
執行緒中斷
	at java.lang.Thread.sleep(Native Method)
	at Test.run(Test.java:5)
	at java.lang.Thread.run(Thread.java:745)

Process finished with exit code 0

已經過時的方法(stop、suspend、destroy)

 他們分別是強行停止執行緒、強行掛起執行緒、破壞執行緒,但是現在他們已經被廢除,原因便是它們會導致死鎖或其他安全性問題。