如何能確保線程真正停止?在線程同步的時候有一個叫“二次惰性檢測”(double check),能在提高效率的基礎上又確保線程真正中同步控制中。那么我把線程正確退出的方法稱為“雙重安全退出”,就是不以isInterrupted ()為循環條件
五、線程常用的方法1、 sleep()這是一個靜態方法,只能控制當前正在運行的線程,sleep能保證線程最短不會運行時間,但是不能有效保證多少時間后能繼續運行,這與當前cup時間片與系統資源調度有關。2、getState()得到該線程的狀態3、isAlive()確定當前線程是否處在活動狀態。可運行或阻塞返回true,其他狀態返回false4、isInterrupted()判斷線程是否被中斷,已經中斷返回true,否則為false5、interrupt()中斷線程。一個線程強制停止是很危險的,這個方法并不會強制停止線程,而是告訴這個線程自己可以找個地方停下來了。如果無法中斷(例如進入一個同步鎖代碼塊時,是不能被中斷的),會拋出SecurityException,但是 ReentrantLock 支持可中斷的獲取模式即 tryLock(long time, TimeUnit unit)。6、getPriority()返回線程的優先級7、setPriority()更改線程的優先級8、join()等待線程終止,有參數可以設置等待該線程終止的時間最長為 millis 毫秒 + nanos 納秒。9、yield ()暫停當前正在執行的線程,并執行其他線程六、wait()與sleep()的區別sleep()可以將一個線程睡眠,參數可以指定一個時間。wait()可以將一個線程掛起,直到超時或者該線程被喚醒。(java.lang.Object類中提供了wait(), notify()和notifyAll()方法來操作線程)1、功能差不多,都用來進行線程控制,他們最大本質的區別是:sleep()不釋放同步鎖,wait()釋放同步鎖2、用法的上的不同是:sleep(milliseconds)可以用時間指定來使他自動醒過來,如果時間不到你只能調用interreput()來強行打斷; wait()可以用notify()直接喚起. sleep是Thread類的靜態方法。sleep的作用是讓線程休眠制定的時間,在時間到達時恢復,也就是說sleep將在接到時間到達事件事恢復線程執行,例如:try{System.out.println("I'm going to bed");Thread.sleep(1000);System.out.println("I wake up");}catch(IntrruptedException e) {} wait是Object的方法,也就是說可以對任意一個對象調用wait方法,調用wait方法將會將調用者的線程掛起,直到其他線程調用同一個對象的notify方法才會重新激活調用者,例如:try{obj.wait();}catch(InterrputedException e) {} 3、這兩者的施加者是有本質區別的 sleep()是讓某個線程暫停運行一段時間,其控制范圍是由當前線程決定,也就是說,在線程里面決定。 wait()是由某個確定的對象來調用的,將這個對象理解成一個傳話的人,當這個人在某個線程里面說"暫停!",也是obj.wait(),這里的暫停是阻塞 ,再等一個傳話人說“ok繼續執行”,就繼續起來執行兩者都可以讓線程暫停一段時間,但是本質的區別是一個線程的運行狀態控制,一個是線程之間的通訊的問題 總結sleep和wait的區別有: 1,這兩個方法來自不同的類分別是Thread和Object 2,最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。 3,wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在 任何地方使用 synchronized(x){ x.notify() //或者wait() } 4,sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常新聞熱點
疑難解答