Thread各方法適用情況

sleep()

try {
     Thread.sleep(2000);
} catch (InterruptedException e) {
     e.printStackTrace();
}
SystemClock.sleep(2000);

sleep()方法會使線程睡眠,交出CPU給其他線程使用。

注意:sleep()方法不會釋放鎖。

上述第二個方法為Android獨有,兩者的區別就為是否catch InterruptedException,欲知該異常的作用,請見interrupt()方法。先說結果,該方法屏蔽了interrupt通知。

interrupt()

Thread thread = new Thread() {
    @Override
    public void run() {
        for (int i = 0; i < 1000000; i++) {
            if (Thread.interrupted()) {
                // 收尾
                return;
            }
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                // 收尾
                return;
            }
        }
    }
};
thread.start();
SystemClock.sleep(1000);
thread.interrupt();

了解interrupt()之前,我們先講一下被棄用的stop()方法。

stop()方法調用后會立即結束線程,而不管線程此時在做何事情。這就會引發不可預知的問題,假如線程正在對一個int型變量賦值,剛寫完高位地址準備寫低位地址,此時stop()方法來了,線程停止,那這個變量的值可就天知道了。

所以,請使用interrupt()方法代替stop()方法

interrupt()方法不會立即結束線程,而會通知線程“你需要中斷了”,那么線程接收到中斷通知后,什么時候執行呢?有三種情況:

  1. Thread.interrupted()

    interrupted()方法會攔截該通知,讓用戶進行一系列收尾工作。

  2. InterruptedException

    還記得上面sleep()方法中的異常嗎?就是這個貨。這貨會在線程是空閑的情況下攔截該通知并進行收尾工作,畢竟線程空閑著,也不會搞事情。

    注意:這可不是報錯,并不是所有的異常都是錯誤信息。

  3. 線程:“哦,我接收到了”,然后就沒有然后了。

wait()/notify()/notifyAll()

private synchronized void initString() {
    sharedString = "Woong === ";
    notifyAll();
    //notify()
}

private synchronized void printString() {
    //不能是if,因為notify()后會直接執行wait()后面的代碼,可能會造成判斷失效
    while (sharedString == null) {
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    System.out.println("String: " + sharedString);
}

當線程執行wait()后,線程會釋放鎖,并進入到阻塞。

當收到notify()方法后,該線程會等待獲取鎖,獲取鎖后則會執行wait()之后的代碼段

當有多個線程(同一個鎖)進入wait()時,notify()只會通知一個線程,其他線程繼續wait()。要想通知所有線程,需使用notifyAll()。

wait()方法會釋放鎖。

join()

假設有兩個線程thread1和thread2,在thread1中調用thread2.join(),則會讓thread1阻塞,開始執行thread2,只有當thread2結束后,才會繼續運行。

可以簡單的概括為,join()方法讓線程串行運行。

join()內部調用了wait()方法,所以會釋放鎖。

yield()

該方法很少用到,它會讓線程停一下,對,就是停一下。然后讓同優先級的線程工作一下。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容