多線程(2) — 線程中一些常用的方法和關鍵字


1.start()和run()

  start()方法是是開啟線程的方法,這個方法執行后,一個線程才真正的進入RUNNABLE狀態。run()方法是線程中具體執行的業務活動,一般都要重寫run()方法。

2.stop()

  stop()方法在結束線程時,會直接終止線程,並立即釋放這個線程所持有的鎖,而鎖恰恰是用來維護對象一致性的。例如寫線程正在寫到一半,線程被強行終止,對象就會被寫壞了,同時鎖已經釋放,其他對象讀到這個對象是寫壞了的對象。

3.interrupt()、isInterrupted()、interrupted()

  interrupt()方法是一個實例方法,它通知目標線程中斷,也就是設置中斷標志位。相當於給線程發送一個通知,告知要人希望你退出了。至於目標線程以后怎么處理看目標線程自己的了。isInterrupted()方法也是實例方法,他判斷當前線程是否被中斷。interrupted()是個靜態方法,可用來判斷當前線程的中斷狀態,同時會清除當前線程的中斷標志位狀態。

4.sleep()

  sleep()方法是讓當前線程休眠若干時間,它會拋出一個InterruptedException中斷異常。這個異常不是運行時異常,必須捕獲且處理,當線程在sleep()休眠時,如果被中斷,這個異常就會產生。一旦被中斷后,拋出異常,會清除標記位,如果不加處理,下一次循環開始時,就無法捕獲這個中斷,故一般在異常處理時再設置標記位。sleep()方法不會釋放任何對象的鎖資源。

5.wait()和notify()

  wait()等待方法,是Object類中的方法,當一個對象實例上調用wait()方法后,當前線程就會在這個對象上等待。那么等待什么時候結束呢?線程一直等到其他線程調用了這個對象的notify()方法為止。這樣實例對象就成了多個線程間的通信手段。wait()和notify()不能隨便調用,它必須包含在對應的synchronize語句中,這倆方法,都需要首先獲得目標對象的一個監聽器,而wait()和notify()方法在執行后會釋放這個監聽器。wait()方法會釋放目標對象的鎖。

6.suspend()和resume()

  suspend()方法掛起線程,resume()方法繼續執行,被掛起的線程必須等到resume()才能繼續指定。suspend()方法在導致線程暫停的同時,並不會釋放任何鎖資源,而其他線程要訪問被它占用的鎖時會被牽連導致無法正常運行,只到遇到resume()操作才能繼續。被suspend掛起的線程,從 它的線程狀態來看,居然還是RUNNABLE,會影響判斷。因此這倆方法已經被廢棄,不建議使用。

7.join()和yeild()

  join()方法表示無限的等待,他會一直阻塞當前線程,只到目標線程執行完畢。join(long millis) 給出了一個最大等待時間,如果超過給定的時間目標線程還在執行,當前線程就不等了,繼續往下執行。

  yeild()方法是個靜態方法,一旦執行,他會使當前線程讓出CPU。讓出CPU不代表當前線程不執行了,還會進行CPU資源的爭奪。如果一個線程不重要或優先級比較低,可以調用這個方法,把資源給重要的線程去做。

8.volatile

  當用事volatile聲明一個變量的時候,就是告訴虛擬機,這個變量極有可能會被某些程序或者線程修改。為了確保修改后,所有線程能看到這個改動,虛擬機會采取一些手段保證這個變量的可見性。

9.守護線程和用戶線程

  守護線程是系統的守護者,在后台默默的完成系統性服務,比如垃圾回收線程、JIT線程等。用戶線程是系統的工作線程,完成這個系統要完成的因為操作,如果所有的用戶線程結束了,那么守護線程也就不存在了,整個程序也就結束了。當一個Java應用里只有守護線程時,Java虛擬機會自然退出。

  設置守護線程必須在start()之前設置,Thread.setDaemon(true)。

10.synchronize

  synchronize關鍵字的作用是實現線程間的同步。它的工作是對同步代碼加鎖,使得每次只能有一個線程能進入代碼塊,從而保證了線程間的安全性。使用方法:知道加鎖對象,直接作用於實例方法,直接作用於靜態方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM