run與start差別
run():直接調用run(),相當于直接調用線程的方法,起不到jvm進行多線程排程的效果。(錯誤的用法)
start():将線程加入排程,排程到時會執行run()方法。(正确的用法)
sleep與wait差別
wait():另見《Java并發程式設計之美》=>1.3 線程通知與等待
項 | sleep() | wait() |
相同點 | ||
是否可中斷 | 都可被中斷 | |
是否需捕獲異常 | 都需要捕獲 | |
不同點 | ||
實際作用 | 暫時退出對cpu的占用 | 進入等待此對象的等待鎖定池 |
所在類 | Thread的靜态方法:Thread.sleep(n) 機關:毫秒 | Object類的非靜态方法:obj.wait() |
是否釋放鎖 | 不釋放鎖(若持有鎖) | 釋放鎖 |
調用位置 | 可以在任何地方調用 | 隻能在synchronized的方法或代碼塊中使用。 |
喚醒條件 | (1)其他線程調用了該共享對象的 notify()或 者 notityAll()方法; ( 2 ) 其他線程調用了該線程的 interrupt()方法 | (1)逾時 ( 2 ) 其他線程調用了該線程的 interrupt()方法 |
特殊用法 | Thread.sleep(0)的作用:引發新的排程。 | obj.wait(0)的作用: |
wait方法的重載
(另見《Java并發程式設計之美》=>1.3 線程通知與等待)
方法 作用 wait() 一個線程調用一個共享變量的wait()方 法 時 ,該調用線程會被阻塞挂起,直到發生下面幾件事情之一才傳回: (1)其他線程調用了該共享對象的 notify()或 者 notityAll()方法;
( 2 ) 其他線程調用了該線程的 interrupt()方法,該線程拋出InterruptedException異常傳回。
wait(long timeout) 如果一個線程調用共享對象的該方法挂起後,沒有在指定的timeout ms時間内被其他線程調用該共享變量的notify()或者notifyAll()方法喚醒,那麼該函數還是會因為逾時而傳回。 wait(long timeout, int nanos) 調用wait(timeout);
源碼:
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
}
wait(timeout);
}
Thread.sleep(0)作用
其他網址