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()方法不會立即結束線程,而會通知線程“你需要中斷了”,那么線程接收到中斷通知后,什么時候執行呢?有三種情況:
-
Thread.interrupted()
interrupted()方法會攔截該通知,讓用戶進行一系列收尾工作。
-
InterruptedException
還記得上面sleep()方法中的異常嗎?就是這個貨。這貨會在線程是空閑的情況下攔截該通知并進行收尾工作,畢竟線程空閑著,也不會搞事情。
注意:這可不是報錯,并不是所有的異常都是錯誤信息。
線程:“哦,我接收到了”,然后就沒有然后了。
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()
該方法很少用到,它會讓線程停一下,對,就是停一下。然后讓同優先級的線程工作一下。