天天看點

Java多線程--程式設計雜項

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)的作用:
Java多線程--程式設計雜項

​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)作用

​其他網址​