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

分享

java線程的幾個(gè)概念和方法

 昵稱14517214 2013-11-05



在Java中創(chuàng)建線程有兩種方法:使用Thread類和使用Runnable接口,。
要注意的是Thread類也實(shí)現(xiàn)了Runnable接口,,因此,從Thread類繼承的類的實(shí)例也可以作為target傳入這個(gè)構(gòu)造方法,??赏ㄟ^(guò)這種方法實(shí)現(xiàn)多個(gè)線程的資源共享。

線程的生命周期:
新建狀態(tài):用new語(yǔ)句創(chuàng)建的線程對(duì)象處于新建狀態(tài),,此時(shí)它和其它的java對(duì)象一樣,,僅僅在堆中被分配了內(nèi)存
就緒狀態(tài):當(dāng)一個(gè)線程創(chuàng)建了以后,其他的線程調(diào)用了它的start()方法,,該線程就進(jìn)入了就緒狀態(tài),。處于這個(gè)狀態(tài)的線程位于可運(yùn)行池中,等待獲得CPU的使用權(quán)
運(yùn)行狀態(tài):處于這個(gè)狀態(tài)的線程占用CPU,執(zhí)行程序的代碼
阻塞狀態(tài):當(dāng)線程處于阻塞狀態(tài)時(shí),,java虛擬機(jī)不會(huì)給線程分配CPU,,直到線程重新進(jìn)入就緒狀態(tài),它才有機(jī)會(huì)轉(zhuǎn)到運(yùn)行狀態(tài),。
阻塞狀態(tài)分為三種情況:
1,、 位于對(duì)象等待池中的阻塞狀態(tài):當(dāng)線程運(yùn)行時(shí),,如果執(zhí)行了某個(gè)對(duì)象的wait()方法,java虛擬機(jī)就回把線程放到這個(gè)對(duì)象的等待池中
2,、 位于對(duì)象鎖中的阻塞狀態(tài),,當(dāng)線程處于運(yùn)行狀態(tài)時(shí),試圖獲得某個(gè)對(duì)象的同步鎖時(shí),,如果該對(duì)象的同步鎖已經(jīng)被其他的線程占用,JVM就會(huì)把這個(gè)線程放到這個(gè)對(duì)象的瑣池中,。
3,、 其它的阻塞狀態(tài):當(dāng)前線程執(zhí)行了sleep()方法,或者調(diào)用了其它線程的join()方法,,或者發(fā)出了I/O請(qǐng)求時(shí),,就會(huì)進(jìn)入這個(gè)狀態(tài)中。

一,、創(chuàng)建并運(yùn)行線程
    當(dāng)調(diào)用start方法后,,線程開(kāi)始執(zhí)行run方法中的代碼。線程進(jìn)入運(yùn)行狀態(tài),??梢酝ㄟ^(guò)Thread類的isAlive方法來(lái)判斷線程是否處于運(yùn)行狀態(tài)。當(dāng)線程處于運(yùn)行狀態(tài)時(shí),,isAlive返回true,,當(dāng)isAlive返回false時(shí),可能線程處于等待狀態(tài),,也可能處于停止?fàn)顟B(tài),。

二、掛起和喚醒線程
一但線程開(kāi)始執(zhí)行run方法,,就會(huì)一直到這個(gè)run方法執(zhí)行完成這個(gè)線程才退出,。但在線程執(zhí)行的過(guò)程中,可以通過(guò)兩個(gè)方法使線程暫時(shí)停止執(zhí)行,。這兩個(gè)方法是suspend和sleep,。在使用suspend掛起線程后,可以通過(guò)resume方法喚醒線程,。而使用sleep使線程休眠后,,只能在設(shè)定的時(shí)間后使線程處于就緒狀態(tài)(在線程休眠結(jié)束后,線程不一定會(huì)馬上執(zhí)行,,只是進(jìn)入了就緒狀態(tài),,等待著系統(tǒng)進(jìn)行調(diào)度)。
雖然suspend和resume可以很方便地使線程掛起和喚醒,,但由于使用這兩個(gè)方法可能會(huì)造成一些不可預(yù)料的事情發(fā)生,,因此,,這兩個(gè)方法被標(biāo)識(shí)為deprecated(抗議)標(biāo)記,這表明在以后的jdk版本中這兩個(gè)方法可能被刪除,,所以盡量不要使用這兩個(gè)方法來(lái)操作線程,。下面的代碼演示了sleep、suspend和resume三個(gè)方法的使用,。

三,、終止線程的三種方法
有三種方法可以使終止線程。
1.  使用退出標(biāo)志,,使線程正常退出,,也就是當(dāng)run方法完成后線程終止。
2.  使用stop方法強(qiáng)行終止線程(這個(gè)方法不推薦使用,,因?yàn)閟top和suspend,、resume一樣,也可能發(fā)生不可預(yù)料的結(jié)果),。
3.  使用interrupt方法中斷線程,。

線程的幾個(gè)方法:
join():等待此線程死亡后再繼續(xù),可使異步線程變?yōu)橥骄€程
interrupt():中斷線程,,被中斷線程會(huì)拋InterruptedException

線程通信:wait(),notify()   - 典型應(yīng)用:放取雞蛋
wait() 等待獲取鎖:

表示等待獲取某個(gè)鎖

執(zhí)行了該方法的線程釋放對(duì)象的鎖,,JVM會(huì)把該線程放到對(duì)象的等待池中。該線程等待其它線程喚醒
notify() 執(zhí)行該方法的線程喚醒在對(duì)象的等待池中等待的一個(gè)線程,,JVM從對(duì)象的等待池中隨機(jī)選擇一個(gè)線程,,把它轉(zhuǎn)到對(duì)象的鎖池中。使線程由阻塞隊(duì)列進(jìn)入就緒狀態(tài)

sleep():讓當(dāng)前正在執(zhí)行的線程休眠,,有一個(gè)用法可以代替yield函數(shù)——sleep(0)
yield():暫停當(dāng)前正在執(zhí)行的線程對(duì)象,,并執(zhí)行其他線程。也就是交出CPU一段時(shí)間

sleep和yield區(qū)別:
1,、sleep()方法會(huì)給其他線程運(yùn)行的機(jī)會(huì),,而不考慮其他線程的優(yōu)先級(jí),因此會(huì)給較低線程一個(gè)運(yùn)行的機(jī)會(huì),;yield()方法只會(huì)給相同優(yōu)先級(jí)或者更高優(yōu)先級(jí)的線程一個(gè)運(yùn)行的機(jī)會(huì),。
2、當(dāng)線程執(zhí)行了sleep(long millis)方法后,,將轉(zhuǎn)到阻塞狀態(tài),,參數(shù)millis指定睡眠時(shí)間;當(dāng)線程執(zhí)行了yield()方法后,,將轉(zhuǎn)到就緒狀態(tài),。
3、sleep()方法聲明拋出InterruptedException異常,,而yield()方法沒(méi)有聲明拋出任何異常
4,、sleep()方法比yield()方法具有更好的移植性

如果希望明確地讓一個(gè)線程給另外一個(gè)線程運(yùn)行的機(jī)會(huì),,可以采取以下的辦法之一:
1、 調(diào)整各個(gè)線程的優(yōu)先級(jí)
2,、 讓處于運(yùn)行狀態(tài)的線程調(diào)用Thread.sleep()方法
3,、 讓處于運(yùn)行狀態(tài)的線程調(diào)用Thread.yield()方法
4、 讓處于運(yùn)行狀態(tài)的線程調(diào)用另一個(gè)線程的join()方法

首先,,wait()和notify(),notifyAll()是Object類的方法,,sleep()和yield()是Thread類的方法

(1).常用的wait方法有wait()wait(long timeout):
    void wait() 在其他線程調(diào)用此對(duì)象的 notify() 方法或 notifyAll() 方法前,,導(dǎo)致當(dāng)前線程等待,。
    void wait(long timeout) 在其他線程調(diào)用此對(duì)象的 notify() 方法或 notifyAll() 方法,或者超過(guò)指定的時(shí)間量前,,導(dǎo)致當(dāng)前線程等待。
    wait()后,,線程會(huì)釋放掉它所占有的“鎖標(biāo)志”,,從而使線程所在對(duì)象中的其它synchronized數(shù)據(jù)可被別的線程使用。
    wait()和notify()因?yàn)闀?huì)對(duì)對(duì)象的“鎖標(biāo)志”進(jìn)行操作,,所以它們必須在synchronized函數(shù)或synchronized  block中進(jìn)行調(diào)用,。如果在non-synchronized函數(shù)或non-synchronized block中進(jìn)行調(diào)用,雖然能編譯通過(guò),,但在運(yùn) 行時(shí)會(huì)發(fā)生IllegalMonitorStateException的異常,。

(2).Thread.sleep(long millis),必須帶有一個(gè)時(shí)間參數(shù)
    sleep(long)使當(dāng)前線程進(jìn)入停滯狀態(tài),,所以執(zhí)行sleep()的線程在指定的時(shí)間內(nèi)肯定不會(huì)被執(zhí)行,;
    sleep(long)可使優(yōu)先級(jí)低的線程得到執(zhí)行的機(jī)會(huì),當(dāng)然也可以讓同優(yōu)先級(jí)和高優(yōu)先級(jí)的線程有執(zhí)行的機(jī)會(huì),;
    sleep(long)是不會(huì)釋放鎖標(biāo)志的,。

(3).yield()沒(méi)有參數(shù)。
    sleep 方法使當(dāng)前運(yùn)行中的線程睡眼一段時(shí)間,,進(jìn)入不可運(yùn)行狀態(tài),,這段時(shí)間的長(zhǎng)短是由程序設(shè)定的,yield 方法使當(dāng)前線程讓出CPU占有權(quán),,但讓出的時(shí)間是不可設(shè)定的,。
    yield()也不會(huì)釋放鎖標(biāo)志。

    實(shí)際上,,yield()方法對(duì)應(yīng)了如下操作: 先檢測(cè)當(dāng)前是否有相同優(yōu)先級(jí)的線程處于同可運(yùn)行狀態(tài),,如有,則把 CPU 的占有權(quán)交給此線程,,否則繼續(xù)運(yùn)行原來(lái)的線程,。所以yield()方法稱為“退讓”,,它把運(yùn)行機(jī)會(huì)讓給了同等優(yōu)先級(jí)的其他線程。

    sleep方法允許較低優(yōu)先級(jí)的線程獲得運(yùn)行機(jī)會(huì),,但yield()方法執(zhí)行時(shí),,當(dāng)前線程仍處在可運(yùn)行狀態(tài),所以不可能讓出較低優(yōu)先級(jí)的線程些時(shí)獲得CPU占有權(quán),。 在一個(gè)運(yùn)行系統(tǒng)中,,如果較高優(yōu)先級(jí)的線程沒(méi)有調(diào)用 sleep 方法,又沒(méi)有受到 I/O阻塞,,那么較低優(yōu)先級(jí)線程只能等待所有較高優(yōu)先級(jí)的線程運(yùn)行結(jié)束,,才有機(jī)會(huì)運(yùn)行。

    yield()只是使當(dāng)前線程重新回到可執(zhí)行狀態(tài),,所以執(zhí)行yield()的線程有可能在進(jìn)入到可執(zhí)行狀態(tài)后馬上又被執(zhí)行,。所以yield()只能使同優(yōu)先級(jí)的線程有執(zhí)行的機(jī)會(huì)。

volitile 語(yǔ)義:
volatile相當(dāng)于synchronized的弱實(shí)現(xiàn),,也就是說(shuō)volatile實(shí)現(xiàn)了類似synchronized的語(yǔ)義,,卻又沒(méi)有鎖機(jī)制。它確保對(duì)volatile字段的更新以可預(yù)見(jiàn)的方式告知其他的線程,。
volatile包含以下語(yǔ)義:
(1)Java 存儲(chǔ)模型不會(huì)對(duì)valatile指令的操作進(jìn)行重排序:這個(gè)保證對(duì)volatile變量的操作時(shí)按照指令的出現(xiàn)順序執(zhí)行的,。
(2)volatile變量不會(huì)被緩存在寄存器中(只有擁有線程可見(jiàn))或者其他對(duì)CPU不可見(jiàn)的地方,每次總是從主存中讀取volatile變量的結(jié)果,。也就是說(shuō)對(duì)于volatile變量的修改,,其它線程總是可見(jiàn)的,并且不是使用自己線程棧內(nèi)部的變量,。也就是在happens-before法則中,,對(duì)一個(gè)valatile變量的寫(xiě)操作后,其后的任何讀操作理解可見(jiàn)此寫(xiě)操作的結(jié)果,。
盡管volatile變量的特性不錯(cuò),,但是volatile并不能保證線程安全的,也就是說(shuō)volatile字段的操作不是原子性的,,volatile變量只能保證可見(jiàn)性(一個(gè)線程修改后其它線程能夠理解看到此變化后的結(jié)果),,要想保證原子性,目前為止只能加鎖,!

數(shù)據(jù)同步:

線程同步的特征:
1,、 如果一個(gè)同步代碼塊和非同步代碼塊同時(shí)操作共享資源,仍然會(huì)造成對(duì)共享資源的競(jìng)爭(zhēng),。因?yàn)楫?dāng)一個(gè)線程執(zhí)行一個(gè)對(duì)象的同步代碼塊時(shí),,其他的線程仍然可以執(zhí)行對(duì)象的非同步代碼塊。(所謂的線程之間保持同步,,是指不同的線程在執(zhí)行同一個(gè)對(duì)象的同步代碼塊時(shí),,因?yàn)橐@得對(duì)象的同步鎖而互相牽制)
2,、 每個(gè)對(duì)象都有唯一的同步鎖
3、 在靜態(tài)方法前面可以使用synchronized修飾符,。
4,、 當(dāng)一個(gè)線程開(kāi)始執(zhí)行同步代碼塊時(shí),并不意味著必須以不間斷的方式運(yùn)行,,進(jìn)入同步代碼塊的線程可以執(zhí)行Thread.sleep()或者執(zhí)行Thread.yield()方法,,此時(shí)它并不釋放對(duì)象鎖,只是把運(yùn)行的機(jī)會(huì)讓給其他的線程,。
5,、 Synchronized聲明不會(huì)被繼承,如果一個(gè)用synchronized修飾的方法被子類覆蓋,,那么子類中這個(gè)方法不在保持同步,,除非用synchronized修飾。  

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多