Java并發(fā)編程:Thread類的使用

版權(quán)聲明:本文為海子原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處!

在前面2篇文章分別講到了線程和進(jìn)程的由來(lái)、以及如何在Java中怎么創(chuàng)建線程和進(jìn)程壹无。今天我們來(lái)學(xué)習(xí)一下Thread類,在學(xué)習(xí)Thread類之前感帅,先介紹與線程相關(guān)知識(shí):線程的幾種狀態(tài)斗锭、上下文切換,然后接著介紹Thread類中的方法的具體使用失球。

一岖是、線程的狀態(tài)

在正式學(xué)習(xí)Thread類中的具體方法之前帮毁,我們先來(lái)了解一下線程有哪些狀態(tài),這個(gè)將會(huì)有助于后面對(duì)Thread類中的方法的理解豺撑。

線程從創(chuàng)建到最終的消亡烈疚,要經(jīng)歷若干個(gè)狀態(tài)。一般來(lái)說(shuō)聪轿,線程包括以下這幾個(gè)狀態(tài):創(chuàng)建(new)爷肝、就緒(runnable)、運(yùn)行(running)、阻塞(blocked)、time waiting需了、waiting、消亡(dead)对嚼。
當(dāng)需要新起一個(gè)線程來(lái)執(zhí)行某個(gè)子任務(wù)時(shí),就創(chuàng)建了一個(gè)線程外莲。但是線程創(chuàng)建之后猪半,不會(huì)立即進(jìn)入就緒狀態(tài)兔朦,因?yàn)榫€程的運(yùn)行需要一些條件(比如內(nèi)存資源偷线,在前面的JVM內(nèi)存區(qū)域劃分一篇博文中知道程序計(jì)數(shù)器、Java棧沽甥、本地方法棧都是線程私有的声邦,所以需要為線程分配一定的內(nèi)存空間),只有線程運(yùn)行需要的所有條件滿足了摆舟,才進(jìn)入就緒狀態(tài)亥曹。
當(dāng)線程進(jìn)入就緒狀態(tài)后,不代表立刻就能獲取CPU執(zhí)行時(shí)間恨诱,也許此時(shí)CPU正在執(zhí)行其他的事情媳瞪,因此它要等待。當(dāng)?shù)玫紺PU執(zhí)行時(shí)間之后照宝,線程便真正進(jìn)入運(yùn)行狀態(tài)蛇受。
線程在運(yùn)行狀態(tài)過(guò)程中,可能有多個(gè)原因?qū)е庐?dāng)前線程不繼續(xù)運(yùn)行下去厕鹃,比如用戶主動(dòng)讓線程睡眠(睡眠一定的時(shí)間之后再重新執(zhí)行)兢仰、用戶主動(dòng)讓線程等待,或者被同步塊給阻塞剂碴,此時(shí)就對(duì)應(yīng)著多個(gè)狀態(tài):time waiting(睡眠或等待一定的事件)把将、waiting(等待被喚醒)、blocked(阻塞)忆矛。
當(dāng)由于突然中斷或者子任務(wù)執(zhí)行完畢察蹲,線程就會(huì)被消亡。
下面這副圖描述了線程從創(chuàng)建到消亡之間的狀態(tài):

在有些教程上將blocked、waiting递览、time waiting統(tǒng)稱為阻塞狀態(tài)叼屠,這個(gè)也是可以的,只不過(guò)這里我想將線程的狀態(tài)和Java中的方法調(diào)用聯(lián)系起來(lái)绞铃,所以將waiting和time waiting兩個(gè)狀態(tài)分離出來(lái)镜雨。

二、上下文切換

對(duì)于單核CPU來(lái)說(shuō)(對(duì)于多核CPU儿捧,此處就理解為一個(gè)核)荚坞,CPU在一個(gè)時(shí)刻只能運(yùn)行一個(gè)線程,當(dāng)在運(yùn)行一個(gè)線程的過(guò)程中轉(zhuǎn)去運(yùn)行另外一個(gè)線程菲盾,這個(gè)叫做線程上下文切換(對(duì)于進(jìn)程也是類似)颓影。

由于可能當(dāng)前線程的任務(wù)并沒(méi)有執(zhí)行完畢,所以在切換時(shí)需要保存線程的運(yùn)行狀態(tài)懒鉴,以便下次重新切換回來(lái)時(shí)能夠繼續(xù)切換之前的狀態(tài)運(yùn)行诡挂。舉個(gè)簡(jiǎn)單的例子:比如一個(gè)線程A正在讀取一個(gè)文件的內(nèi)容,正讀到文件的一半临谱,此時(shí)需要暫停線程A璃俗,轉(zhuǎn)去執(zhí)行線程B,當(dāng)再次切換回來(lái)執(zhí)行線程A的時(shí)候悉默,我們不希望線程A又從文件的開頭來(lái)讀取城豁。

因此需要記錄線程A的運(yùn)行狀態(tài),那么會(huì)記錄哪些數(shù)據(jù)呢抄课?因?yàn)橄麓位謴?fù)時(shí)需要知道在這之前當(dāng)前線程已經(jīng)執(zhí)行到哪條指令了唱星,所以需要記錄程序計(jì)數(shù)器的值,另外比如說(shuō)線程正在進(jìn)行某個(gè)計(jì)算的時(shí)候被掛起了跟磨,那么下次繼續(xù)執(zhí)行的時(shí)候需要知道之前掛起時(shí)變量的值時(shí)多少间聊,因此需要記錄CPU寄存器的狀態(tài)。所以一般來(lái)說(shuō)抵拘,線程上下文切換過(guò)程中會(huì)記錄程序計(jì)數(shù)器哎榴、CPU寄存器狀態(tài)等數(shù)據(jù)。

說(shuō)簡(jiǎn)單點(diǎn)的:對(duì)于線程的上下文切換實(shí)際上就是 存儲(chǔ)和恢復(fù)CPU狀態(tài)的過(guò)程仑濒,它使得線程執(zhí)行能夠從中斷點(diǎn)恢復(fù)執(zhí)行叹话。

雖然多線程可以使得任務(wù)執(zhí)行的效率得到提升,但是由于在線程切換時(shí)同樣會(huì)帶來(lái)一定的開銷代價(jià)墩瞳,并且多個(gè)線程會(huì)導(dǎo)致系統(tǒng)資源占用的增加驼壶,所以在進(jìn)行多線程編程時(shí)要注意這些因素。

三喉酌、Thread類中的方法

通過(guò)查看java.lang.Thread類的源碼可知:

Thread類實(shí)現(xiàn)了Runnable接口热凹,在Thread類中泵喘,有一些比較關(guān)鍵的屬性,比如name是表示Thread的名字般妙,可以通過(guò)Thread類的構(gòu)造器中的參數(shù)來(lái)指定線程名字纪铺,priority表示線程的優(yōu)先級(jí)(最大值為10,最小值為1碟渺,默認(rèn)值為5)鲜锚,daemon表示線程是否是守護(hù)線程,target表示要執(zhí)行的任務(wù)苫拍。
下面是Thread類中常用的方法:

以下是關(guān)系到線程運(yùn)行狀態(tài)的幾個(gè)方法:

  • 1)start方法
    start()用來(lái)啟動(dòng)一個(gè)線程芜繁,當(dāng)調(diào)用start方法后,系統(tǒng)才會(huì)開啟一個(gè)新的線程來(lái)執(zhí)行用戶定義的子任務(wù)绒极,在這個(gè)過(guò)程中骏令,會(huì)為相應(yīng)的線程分配需要的資源。
  • 2)run方法
    run()方法是不需要用戶來(lái)調(diào)用的垄提,當(dāng)通過(guò)start方法啟動(dòng)一個(gè)線程之后榔袋,當(dāng)線程獲得了CPU執(zhí)行時(shí)間,便進(jìn)入run方法體去執(zhí)行具體的任務(wù)铡俐。注意凰兑,繼承Thread類必須重寫run方法,在run方法中定義具體要執(zhí)行的任務(wù)高蜂。
  • 3)sleep方法
    sleep方法有兩個(gè)重載版本:
sleep(long millis)     //參數(shù)為毫秒

sleep(long millis,int nanoseconds)    //第一參數(shù)為毫秒聪黎,第二個(gè)參數(shù)為納秒

sleep相當(dāng)于讓線程睡眠罕容,交出CPU备恤,讓CPU去執(zhí)行其他的任務(wù)。
但是有一點(diǎn)要非常注意锦秒,sleep方法不會(huì)釋放鎖露泊,也就是說(shuō)如果當(dāng)前線程持有對(duì)某個(gè)對(duì)象的鎖,則即使調(diào)用sleep方法旅择,其他線程也無(wú)法訪問(wèn)這個(gè)對(duì)象惭笑。看下面這個(gè)例子就清楚了:

public class Test {
 
private int i = 10;
private Object object = new Object();
 
public static void main(String[] args) throws IOException  {
    Test test = new Test();
    MyThread thread1 = test.new MyThread();
    MyThread thread2 = test.new MyThread();
    thread1.start();
    thread2.start();
} 
 
 
class MyThread extends Thread{
    @Override
    public void run() {
        synchronized (object) {
            i++;
            System.out.println("i:"+i);
            try {
                System.out.println("線程"+Thread.currentThread().getName()+"進(jìn)入睡眠狀態(tài)");
                Thread.currentThread().sleep(10000);
            } catch (InterruptedException e) {
                // TODO: handle exception
            }
            System.out.println("線程"+Thread.currentThread().getName()+"睡眠結(jié)束");
            i++;
            System.out.println("i:"+i);
        }
    }
}

輸出結(jié)果:

從上面輸出結(jié)果可以看出,當(dāng)Thread-0進(jìn)入睡眠狀態(tài)之后生真,Thread-1并沒(méi)有去執(zhí)行具體的任務(wù)沉噩。只有當(dāng)Thread-0執(zhí)行完之后,此時(shí)Thread-0釋放了對(duì)象鎖柱蟀,Thread-1才開始執(zhí)行川蒙。

注意,如果調(diào)用了sleep方法长已,必須捕獲InterruptedException異承笳#或者將該異常向上層拋出昼牛。當(dāng)線程睡眠時(shí)間滿后,不一定會(huì)立即得到執(zhí)行康聂,因?yàn)榇藭r(shí)可能CPU正在執(zhí)行其他的任務(wù)贰健。所以說(shuō)調(diào)用sleep方法相當(dāng)于讓線程進(jìn)入阻塞狀態(tài)。

  • 4)yield方法
    調(diào)用yield方法會(huì)讓當(dāng)前線程交出CPU權(quán)限恬汁,讓CPU去執(zhí)行其他的線程伶椿。它跟sleep方法類似,同樣不會(huì)釋放鎖氓侧。但是yield不能控制具體的交出CPU的時(shí)間悬垃,另外,yield方法只能讓擁有相同優(yōu)先級(jí)的線程有獲取CPU執(zhí)行時(shí)間的機(jī)會(huì)甘苍。
    注意尝蠕,調(diào)用yield方法并不會(huì)讓線程進(jìn)入阻塞狀態(tài),而是讓線程重回就緒狀態(tài)载庭,它只需要等待重新獲取CPU執(zhí)行時(shí)間看彼,這一點(diǎn)是和sleep方法不一樣的。
  • 5)join方法
    join方法有三個(gè)重載版本:
join()
join(long millis)     //參數(shù)為毫秒
join(long millis,int nanoseconds)    //第一參數(shù)為毫秒囚聚,第二個(gè)參數(shù)為納秒

假如在main線程中靖榕,調(diào)用thread.join方法,則main方法會(huì)等待thread線程執(zhí)行完畢或者等待一定的時(shí)間顽铸。如果調(diào)用的是無(wú)參join方法茁计,則等待thread執(zhí)行完畢,如果調(diào)用的是指定了時(shí)間參數(shù)的join方法谓松,則等待一定的事件星压。
看下面一個(gè)例子:

public class Test {
 
public static void main(String[] args) throws IOException  {
    System.out.println("進(jìn)入線程"+Thread.currentThread().getName());
    Test test = new Test();
    MyThread thread1 = test.new MyThread();
    thread1.start();
    try {
        System.out.println("線程"+Thread.currentThread().getName()+"等待");
        thread1.join();
        System.out.println("線程"+Thread.currentThread().getName()+"繼續(xù)執(zhí)行");
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
} 
 
class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("進(jìn)入線程"+Thread.currentThread().getName());
        try {
            Thread.currentThread().sleep(5000);
        } catch (InterruptedException e) {
            // TODO: handle exception
        }
        System.out.println("線程"+Thread.currentThread().getName()+"執(zhí)行完畢");
    }
}

輸出結(jié)果:

可以看出,當(dāng)調(diào)用thread1.join()方法后鬼譬,main線程會(huì)進(jìn)入等待娜膘,然后等待thread1執(zhí)行完之后再繼續(xù)執(zhí)行。

實(shí)際上調(diào)用join方法是調(diào)用了Object的wait方法优质,這個(gè)可以通過(guò)查看源碼得知:

wait方法會(huì)讓線程進(jìn)入阻塞狀態(tài)竣贪,并且會(huì)釋放線程占有的鎖,并交出CPU執(zhí)行權(quán)限巩螃。
由于wait方法會(huì)讓線程釋放對(duì)象鎖演怎,所以join方法同樣會(huì)讓線程釋放對(duì)一個(gè)對(duì)象持有的鎖。具體的wait方法使用在后面文章中給出避乏。

  • 6)interrupt方法
    interrupt爷耀,顧名思義,即中斷的意思淑际。單獨(dú)調(diào)用interrupt方法可以使得處于阻塞狀態(tài)的線程拋出一個(gè)異常畏纲,也就說(shuō)扇住,它可以用來(lái)中斷一個(gè)正處于阻塞狀態(tài)的線程;另外盗胀,通過(guò)interrupt方法和isInterrupted()方法來(lái)停止正在運(yùn)行的線程艘蹋。
    下面看一個(gè)例子:
public class Test {
public static void main(String[] args) throws IOException  {
    Test test = new Test();
    MyThread thread = test.new MyThread();
    thread.start();
    try {
        Thread.currentThread().sleep(2000);
    } catch (InterruptedException e) {
         
    }
    thread.interrupt();
} 
 
class MyThread extends Thread{
    @Override
    public void run() {
        try {
            System.out.println("進(jìn)入睡眠狀態(tài)");
            Thread.currentThread().sleep(10000);
            System.out.println("睡眠完畢");
        } catch (InterruptedException e) {
            System.out.println("得到中斷異常");
        }
        System.out.println("run方法執(zhí)行完畢");
    }
}

輸出結(jié)果:

從這里可以看出,通過(guò)interrupt方法可以中斷處于阻塞狀態(tài)的線程票灰。那么能不能中斷處于非阻塞狀態(tài)的線程呢女阀?看下面這個(gè)例子:

public class Test {
 
public static void main(String[] args) throws IOException  {
    Test test = new Test();
    MyThread thread = test.new MyThread();
    thread.start();
    try {
        Thread.currentThread().sleep(2000);
    } catch (InterruptedException e) {
         
    }
    thread.interrupt();
} 
 
class MyThread extends Thread{
    @Override
    public void run() {
        int i = 0;
        while(i<Integer.MAX_VALUE){
            System.out.println(i+" while循環(huán)");
            i++;
        }
    }
}

運(yùn)行該程序會(huì)發(fā)現(xiàn),while循環(huán)會(huì)一直運(yùn)行直到變量i的值超出Integer.MAX_VALUE屑迂。所以說(shuō)直接調(diào)用interrupt方法不能中斷正在運(yùn)行中的線程浸策。
但是如果配合isInterrupted()能夠中斷正在運(yùn)行的線程,因?yàn)檎{(diào)用interrupt方法相當(dāng)于將中斷標(biāo)志位置為true惹盼,那么可以通過(guò)調(diào)用isInterrupted()判斷中斷標(biāo)志是否被置位來(lái)中斷線程的執(zhí)行庸汗。比如下面這段代碼:

public class Test {
 
public static void main(String[] args) throws IOException  {
    Test test = new Test();
    MyThread thread = test.new MyThread();
    thread.start();
    try {
        Thread.currentThread().sleep(2000);
    } catch (InterruptedException e) {
         
    }
    thread.interrupt();
} 
 
class MyThread extends Thread{
    @Override
    public void run() {
        int i = 0;
        while(!isInterrupted() && i<Integer.MAX_VALUE){
            System.out.println(i+" while循環(huán)");
            i++;
        }
    }
}

運(yùn)行會(huì)發(fā)現(xiàn),打印若干個(gè)值之后手报,while循環(huán)就停止打印了蚯舱。

但是一般情況下不建議通過(guò)這種方式來(lái)中斷線程,一般會(huì)在MyThread類中增加一個(gè)屬性 isStop來(lái)標(biāo)志是否結(jié)束while循環(huán)掩蛤,然后再在while循環(huán)中判斷isStop的值枉昏。

class MyThread extends Thread{
    private volatile boolean isStop = false;
    @Override
    public void run() {
        int i = 0;
        while(!isStop){
            i++;
        }
    }
     
    public void setStop(boolean stop){
        this.isStop = stop;
    }
}

那么就可以在外面通過(guò)調(diào)用setStop方法來(lái)終止while循環(huán)。

  • 7)stop方法
    stop方法已經(jīng)是一個(gè)廢棄的方法揍鸟,它是一個(gè)不安全的方法兄裂。因?yàn)檎{(diào)用stop方法會(huì)直接終止run方法的調(diào)用,并且會(huì)拋出一個(gè)ThreadDeath錯(cuò)誤阳藻,如果線程持有某個(gè)對(duì)象鎖的話晰奖,會(huì)完全釋放鎖,導(dǎo)致對(duì)象狀態(tài)不一致稚配。所以stop方法基本是不會(huì)被用到的畅涂。
  • 8)destroy方法
    destroy方法也是廢棄的方法港华〉来ǎ基本不會(huì)被使用到。

以下是關(guān)系到線程屬性的幾個(gè)方法:

  • 1)getId :用來(lái)得到線程ID
  • 2)getName和setName : 用來(lái)得到或者設(shè)置線程名稱立宜。
  • 3)getPriority和setPriority :用來(lái)獲取和設(shè)置線程優(yōu)先級(jí)冒萄。
  • 4)setDaemon和isDaemon : 用來(lái)設(shè)置線程是否成為守護(hù)線程和判斷線程是否是守護(hù)線程。

守護(hù)線程和用戶線程的區(qū)別在于:守護(hù)線程依賴于創(chuàng)建它的線程橙数,而用戶線程則不依賴尊流。舉個(gè)簡(jiǎn)單的例子:如果在main線程中創(chuàng)建了一個(gè)守護(hù)線程,當(dāng)main方法運(yùn)行完畢之后灯帮,守護(hù)線程也會(huì)隨著消亡崖技。而用戶線程則不會(huì)逻住,用戶線程會(huì)一直運(yùn)行直到其運(yùn)行完畢。在JVM中迎献,像垃圾收集器線程就是守護(hù)線程瞎访。
Thread類有一個(gè)比較常用的靜態(tài)方法currentThread()用來(lái)獲取當(dāng)前線程。
在上面已經(jīng)說(shuō)到了Thread類中的大部分方法吁恍,那么Thread類中的方法調(diào)用到底會(huì)引起線程狀態(tài)發(fā)生怎樣的變化呢扒秸?下面一幅圖就是在上面的圖上進(jìn)行改進(jìn)而來(lái)的:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冀瓦,隨后出現(xiàn)的幾起案子伴奥,更是在濱河造成了極大的恐慌,老刑警劉巖翼闽,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拾徙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡感局,警方通過(guò)查閱死者的電腦和手機(jī)锣吼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蓝厌,“玉大人玄叠,你說(shuō)我怎么就攤上這事⊥靥幔” “怎么了读恃?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)代态。 經(jīng)常有香客問(wèn)我寺惫,道長(zhǎng),這世上最難降的妖魔是什么蹦疑? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任西雀,我火速辦了婚禮,結(jié)果婚禮上歉摧,老公的妹妹穿的比我還像新娘艇肴。我一直安慰自己,他們只是感情好叁温,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布再悼。 她就那樣靜靜地躺著,像睡著了一般膝但。 火紅的嫁衣襯著肌膚如雪冲九。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天跟束,我揣著相機(jī)與錄音莺奸,去河邊找鬼丑孩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛灭贷,可吹牛的內(nèi)容都是我干的嚎杨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼氧腰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼枫浙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起古拴,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤箩帚,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后黄痪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體紧帕,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年桅打,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了是嗜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挺尾,死狀恐怖鹅搪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遭铺,我是刑警寧澤丽柿,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站魂挂,受9級(jí)特大地震影響甫题,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涂召,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一坠非、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧果正,春花似錦炎码、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至轮锥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間要尔,已是汗流浹背舍杜。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工新娜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人既绩。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓概龄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親饲握。 傳聞我的和親對(duì)象是個(gè)殘疾皇子私杜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 本文主要講了java中多線程的使用方法、線程同步救欧、線程數(shù)據(jù)傳遞衰粹、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等笆怠。在這之前...
    4ea0af17fd67閱讀 590評(píng)論 2 17
  • 本文是我自己在秋招復(fù)習(xí)時(shí)的讀書筆記铝耻,整理的知識(shí)點(diǎn),也是為了防止忘記蹬刷,尊重勞動(dòng)成果瓢捉,轉(zhuǎn)載注明出處哦!如果你也喜歡办成,那...
    波波波先森閱讀 11,273評(píng)論 4 56
  • 單任務(wù) 單任務(wù)的特點(diǎn)是排隊(duì)執(zhí)行泡态,也就是同步,就像再cmd輸入一條命令后迂卢,必須等待這條命令執(zhí)行完才可以執(zhí)行下一條命令...
    Steven1997閱讀 1,182評(píng)論 0 6
  • 進(jìn)程和線程 進(jìn)程 所有運(yùn)行中的任務(wù)通常對(duì)應(yīng)一個(gè)進(jìn)程,當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí),即變成一個(gè)進(jìn)程.進(jìn)程是處于運(yùn)行過(guò)程中...
    勝浩_ae28閱讀 5,115評(píng)論 0 23
  • 身為一名員工情緒是直接影響業(yè)績(jī)的而身為一名店長(zhǎng)情緒又直接影響員工的情緒 晚班員工來(lái)了以后看到早班業(yè)績(jī)那么好而且PK...
    淄川DDM趙鑫閱讀 146評(píng)論 0 0