久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Java線程的5種狀態(tài)及切換(透徹講解)

 流浪的星星318 2017-04-20

 Java中的線程的生命周期大體可分為5種狀態(tài),。

NEW:這種情況指的是,通過New關(guān)鍵字創(chuàng)建了Thread類(或其子類)的對象

RUNNABLE:這種情況指的是Thread類的對象調(diào)用了start()方法,,這時的線程就等待時間片輪轉(zhuǎn)到自己這,,以便獲得CPU;第二種情況是線程在處于RUNNING狀態(tài)時并沒有運行完自己的run方法,,時間片用完之后回到RUNNABLE狀態(tài),;還有種情況就是處于BLOCKED狀態(tài)的線程結(jié)束了當(dāng)前的BLOCKED狀態(tài)之后重新回到RUNNABLE狀態(tài)。

RUNNING:這時的線程指的是獲得CPURUNNABLE線程,,RUNNING狀態(tài)是所有線程都希望獲得的狀態(tài),。

DEAD:處于RUNNING狀態(tài)的線程,在執(zhí)行完run方法之后,,就變成了DEAD狀態(tài)了,。

BLOCKED:這種狀態(tài)指的是處于RUNNING狀態(tài)的線程,出于某種原因,,比如調(diào)用了sleep方法,、等待用戶輸入等而讓出當(dāng)前的CPU給其他的線程。


處于RUNNING狀態(tài)的線程變?yōu)?/span>BLOCKED狀態(tài)的原因,,除了該線程調(diào)用了sleep方法,、等待輸入原因外,還有就是在當(dāng)前線程中調(diào)用了其他線程的join方法,、當(dāng)訪問一個對象的方法時,,該方法被鎖定等。

相應(yīng)的,,當(dāng)處于BLocked狀態(tài)的線程在滿足以下條件時就會由該狀態(tài)轉(zhuǎn)到RUNNABLE狀態(tài),,這些條件是:sleep的線程醒來(sleep的時間到了)、獲得了用戶的輸入,、調(diào)用了join的其他線程結(jié)束,、獲得了對象鎖。

一般情況下,,都是處于RUNNABLE的線程和處于RUNNING狀態(tài)的線程,,互相切換,直到運行完run方法,線程結(jié)束,,進入DEAD狀態(tài),。

以上轉(zhuǎn)自http://blog.csdn.net/yaolingrui/article/details/7522372
以下轉(zhuǎn)自http://zy19982004./blog/1626916

一.線程的狀態(tài)圖

     線程狀態(tài)轉(zhuǎn)換

 

二.初始狀態(tài)

  1. 實現(xiàn)Runnable接口和繼承Thread可以得到一個線程類,new一個實例出來,,線程就進入了初始狀態(tài)

三.可運行狀態(tài)

  1. 可運行狀態(tài)只是說你資格運行,,調(diào)度程序沒有挑選到你,你就永遠是可運行狀態(tài),。
  2. 調(diào)用線程的start()方法,此線程進入可運行狀態(tài),。
  3. 當(dāng)前線程sleep()方法結(jié)束,,其他線程join()結(jié)束,等待用戶輸入完畢,,某個線程拿到對象鎖,,這些線程也將進入可運行狀態(tài)。
  4. 當(dāng)前線程時間片用完了,,調(diào)用當(dāng)前線程的yield()方法,,當(dāng)前線程進入可運行狀態(tài)。
  5. 鎖池里的線程拿到對象鎖后,,進入可運行狀態(tài),。

四.運行狀態(tài)

  1. 線程調(diào)度程序從可運行池中選擇一個線程作為當(dāng)前線程時線程所處的狀態(tài)。這也是線程進入運行狀態(tài)的唯一一種方式,。

五.死亡狀態(tài)

  1. 當(dāng)線程的run()方法完成時,,或者主線程的main()方法完成時,我們就認(rèn)為它死去,。這個線程對象也許是活的,,但是,它已經(jīng)不是一個單獨執(zhí)行的線程,。線程一旦死亡,,就不能復(fù)生。
  2. 在一個死去的線程上調(diào)用start()方法,,會拋出java.lang.IllegalThreadStateException異常,。

六.阻塞狀態(tài)

  1. 當(dāng)前線程T調(diào)用Thread.sleep()方法,當(dāng)前線程進入阻塞狀態(tài),。
  2. 運行在當(dāng)前線程里的其它線程t2調(diào)用join()方法,,當(dāng)前線程進入阻塞狀態(tài)。
  3. 等待用戶輸入的時候,,當(dāng)前線程進入阻塞狀態(tài),。

七.等待隊列(本是Object里的方法,但影響了線程)

  1. 調(diào)用obj的wait(), notify()方法前,必須獲得obj鎖,,也就是必須寫在synchronized(obj) 代碼段內(nèi),。
  2. 與等待隊列相關(guān)的步驟和圖
  • 線程1獲取對象A的鎖,正在使用對象A,。
  • 線程1調(diào)用對象A的wait()方法,。
  • 線程1釋放對象A的鎖,并馬上進入等待隊列,。
  • 鎖池里面的對象爭搶對象A的鎖,。
  • 線程5獲得對象A的鎖,進入synchronized塊,,使用對象A,。
  • 線程5調(diào)用對象A的notifyAll()方法,喚醒所有線程,,所有線程進入鎖池,。||||| 線程5調(diào)用對象A的notify()方法,喚醒一個線程,,不知道會喚醒誰,,被喚醒的那個線程進入鎖池。
  • notifyAll()方法所在synchronized結(jié)束,,線程5釋放對象A的鎖,。
  • 鎖池里面的線程爭搶對象鎖,但線程1什么時候能搶到就不知道了,。||||| 原本鎖池+第6步被喚醒的線程一起爭搶對象鎖,。多線程等待隊列

 

八.鎖池狀態(tài)

  1. 當(dāng)前線程想調(diào)用對象A的同步方法時,發(fā)現(xiàn)對象A的鎖被別的線程占有,,此時當(dāng)前線程進入鎖池狀態(tài),。簡言之,鎖池里面放的都是想爭奪對象鎖的線程,。
  2. 當(dāng)一個線程1被另外一個線程2喚醒時,,1線程進入鎖池狀態(tài),去爭奪對象鎖,。
  3. 鎖池是在同步的環(huán)境下才有的概念,,一個對象對應(yīng)一個鎖池。

九.幾個方法的比較

  1. Thread.sleep(long millis),,一定是當(dāng)前線程調(diào)用此方法,,當(dāng)前線程進入阻塞,但不釋放對象鎖,,millis后線程自動蘇醒進入可運行狀態(tài),。作用:給其它線程執(zhí)行機會的最佳方式。
  2. Thread.yield(),一定是當(dāng)前線程調(diào)用此方法,,當(dāng)前線程放棄獲取的cpu時間片,,由運行狀態(tài)變會可運行狀態(tài),讓OS再次選擇線程,。作用:讓相同優(yōu)先級的線程輪流執(zhí)行,,但并不保證一定會輪流執(zhí)行。實際中無法保證yield()達到讓步目的,,因為讓步的線程還有可能被線程調(diào)度程序再次選中,。Thread.yield()不會導(dǎo)致阻塞。
  3. t.join()/t.join(long millis),,當(dāng)前線程里調(diào)用其它線程1的join方法,,當(dāng)前線程阻塞,但不釋放對象鎖,,直到線程1執(zhí)行完畢或者millis時間到,當(dāng)前線程進入可運行狀態(tài),。
  4. obj.wait(),,當(dāng)前線程調(diào)用對象的wait()方法,當(dāng)前線程釋放對象鎖,,進入等待隊列,。依靠notify()/notifyAll()喚醒或者wait(long timeout)timeout時間到自動喚醒。
  5. obj.notify()喚醒在此對象監(jiān)視器上等待的單個線程,,選擇是任意性的,。notifyAll()喚醒在此對象監(jiān)視器上等待的所有線程。

十.兩個疑問

  1. 當(dāng)對象鎖被某一線程釋放的一瞬間,,鎖池里面的哪個線程能獲得這個鎖,?隨機?隊列FIFO,?or sth else,?
  2. 等待隊列里許許多多的線程都wait()在一個對象上,此時某一線程調(diào)用了對象的notify()方法,,那喚醒的到底是哪個線程,?隨機?隊列FIFO,?or sth else,?java文檔就簡單的寫了句:選擇是任意性的。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多