乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      帶你入門(mén)java-多線程

       Frank_Chia 2018-01-19

      基本概念

      進(jìn)程

      所謂進(jìn)程就是運(yùn)行在操作系統(tǒng)的一個(gè)任務(wù),進(jìn)程是計(jì)算機(jī)任務(wù)調(diào)度的一個(gè)單位,操作系統(tǒng)在啟動(dòng)一個(gè)程序的時(shí)候,會(huì)為其創(chuàng)建一個(gè)進(jìn)程,JVM就是一個(gè)進(jìn)程。進(jìn)程與進(jìn)程之間是相互隔離的,每個(gè)進(jìn)程都有獨(dú)立的內(nèi)存空間。

      計(jì)算機(jī)實(shí)現(xiàn)并發(fā)的原理是:CPU分時(shí)間片,交替執(zhí)行,宏觀并行,微觀串行。同理,在進(jìn)程的基礎(chǔ)上分出更小的任務(wù)調(diào)度單元就是線程,我們所謂的多線程就是一個(gè)進(jìn)程并發(fā)多個(gè)線程。

      線程

      在上面我們提到,一個(gè)進(jìn)程可以并發(fā)出多個(gè)線程,而線程就是最小的任務(wù)執(zhí)行單元,具體來(lái)說(shuō),一個(gè)程序順序執(zhí)行的流程就是一個(gè)線程,我們常見(jiàn)的main就是一個(gè)線程(主線程)。

      線程的組成

      想要擁有一個(gè)線程,有這樣的一些不可或缺的部分,主要有:CPU時(shí)間片,數(shù)據(jù)存儲(chǔ)空間,代碼。

      CPU時(shí)間片都是有操作系統(tǒng)進(jìn)行分配的,數(shù)據(jù)存儲(chǔ)空間就是我們常說(shuō)的堆空間和棧空間,在線程之間,堆空間是多線程共享的,??臻g是互相獨(dú)立的,這樣做的好處不僅在于方便,也減少了很多資源的浪費(fèi)。代碼就不做過(guò)多解釋了,沒(méi)有代碼搞個(gè)毛的多線程。

      線程的創(chuàng)建和啟動(dòng)

      傳統(tǒng)創(chuàng)建線程有兩種方式

      1. 繼承Thread類,覆蓋run方法

      2. 實(shí)現(xiàn)Runnable接口,覆蓋run方法

      Runnable并不是線程對(duì)象,而是一個(gè)任務(wù)對(duì)象。那么Runnable和Thread有什么樣的關(guān)系呢?

      通過(guò)查閱API,我們發(fā)現(xiàn)創(chuàng)建一個(gè)線程除了使用Thread的無(wú)參構(gòu)造方法以外有一個(gè)有參構(gòu)造方法是這樣 :Thread(Runnable target),通過(guò)這個(gè)方法會(huì)分配一個(gè)新的Thread 對(duì)象。

      其中的參數(shù)是一個(gè)類型為Runnable的target屬性。

      Runnable接口最大的作用就是為非Thread子類的類提供了一種實(shí)現(xiàn)線程的方式,只需要實(shí)現(xiàn)Runnable接口就可以借助Thread創(chuàng)建一個(gè)線程;另一方面,如果只想重寫(xiě)run方法,不想得到其他的Thread的方法,實(shí)現(xiàn)Runnable是一個(gè)好的選擇。

      JDK1.5

      線程池

      ExecutorService(線程池 interface)

      帶你入門(mén)java-多線程

      Callable對(duì)象

      帶你入門(mén)java-多線程

      int result = 0; for(int i=2;i<=100;i+=2){ result="" +="i;" thread.sleep;="" }="" return="" result;="" }="" }="" 用future對(duì)象接收f(shuō)ask1的返回值="" 將任務(wù)提交給線程池=""> f = es.submit(task1); //通過(guò)get方法獲取Future中的值 在這個(gè)時(shí)候主線程主動(dòng)的調(diào)取get 如果分支線程還沒(méi)有結(jié)束,主線程會(huì)在這里阻塞 int result = f1.get(); //關(guān)閉線程池 es.shutdown();

      從以上這段代碼我們可以看到很多不一樣的地方,首先在Callable對(duì)象中是可以拋出異常的,其次有返回值,在這個(gè)基礎(chǔ)上也就引出了一個(gè)新的問(wèn)題,如果接收該線程的對(duì)象?JDK1.5中也給出了解決的方法是Future對(duì)象.

      啟動(dòng)線程

      在這里我們需要明白,上面兩種方式并不會(huì)讓我們得到真正的線程,只是得到了線程對(duì)象,只有啟動(dòng)線程,才算得到了真正的線程。

      通過(guò)執(zhí)行start()方法能夠啟動(dòng)一個(gè)線程,但是啟動(dòng)線程并不是立即執(zhí)行,成功啟動(dòng)的線程會(huì)處于就緒狀態(tài),什么時(shí)候執(zhí)行需要等到拿到時(shí)間片之后。

      線程的分類

      用戶線程和守護(hù)(Daemon)線程。

      守護(hù)線程:守護(hù)線程會(huì)一直運(yùn)行,直到其他非守護(hù)線程都結(jié)束的時(shí)候,才會(huì)結(jié)束。有一個(gè)典型的守護(hù)線程就是:垃圾回收線程,和虛擬機(jī)共存亡,直到虛擬機(jī)中沒(méi)有任何線程的時(shí)候虛擬機(jī)關(guān)閉的時(shí)候才會(huì)終止,簡(jiǎn)單說(shuō)就是虛擬機(jī)在,它就在,虛擬機(jī)亡便亡。

      線程的狀態(tài)

      帶你入門(mén)java-多線程

      上面我們提到過(guò),一個(gè)線程在啟動(dòng)之后不會(huì)立馬執(zhí)行,而是處于就緒狀態(tài)(Ready),就緒狀態(tài)就是線程的狀態(tài)的一種,處于這種狀態(tài)的線程意味著一切準(zhǔn)備就緒, 需要等待系統(tǒng)分配到時(shí)間片。為什么沒(méi)有立馬運(yùn)行呢,因?yàn)橥粫r(shí)間只有一個(gè)線程能夠拿到時(shí)間片運(yùn)行,新線程啟動(dòng)的時(shí)候讓它啟動(dòng)的線程(主線程)正在運(yùn)行,只有等主線程結(jié)束,它才有機(jī)會(huì)拿到時(shí)間片運(yùn)行。

      **線程的狀態(tài):**初始狀態(tài)(New),就緒狀態(tài)(Ready),運(yùn)行狀態(tài)(Running)(特別說(shuō)明:在語(yǔ)法的定義中,就緒狀態(tài)和運(yùn)行狀態(tài)是一個(gè)狀態(tài)Runable),等待狀態(tài)(Waitering),終止?fàn)顟B(tài)(Terminated)

      RUNNABLE),等待狀態(tài)(Waitering),終止?fàn)顟B(tài)(Terminated)

      初始狀態(tài)(New)

      線程對(duì)象被創(chuàng)建出來(lái),便是初始狀態(tài),這時(shí)候線程對(duì)象只是一個(gè)普通的對(duì)象,并不是一個(gè)線程。

      Runable

      **就緒狀態(tài)(Ready):**執(zhí)行start方法之后,進(jìn)入就緒狀態(tài),等待被分配到時(shí)間片。

      **運(yùn)行狀態(tài)(Running):**拿到CPU的線程開(kāi)始執(zhí)行。處于運(yùn)行時(shí)間的線程并不是永久的持有CPU直到運(yùn)行結(jié)束,很可能沒(méi)有執(zhí)行完畢時(shí)間片到期,就被收回CPU的使用權(quán)了,之后將會(huì)處于等待狀態(tài)。

      等待狀態(tài)(Waiting)

      等待狀態(tài)分為有限期等待和無(wú)限期等待,所謂有限期等待是線程使用sleep方法主動(dòng)進(jìn)入休眠,有一定的時(shí)間限制,時(shí)間到期就重新進(jìn)入就緒狀態(tài),再次等待被CPU選中。

      而無(wú)限期等待就有些不同了,無(wú)限期并不是指永遠(yuǎn)的等待下去,而是指沒(méi)有時(shí)間限制,可能等待一秒也可能很多秒。至于進(jìn)入等待的原因也不盡相同,可能是因?yàn)镃PU時(shí)間片到期,也可能是因?yàn)橐粋€(gè)比較耗時(shí)的操作(數(shù)據(jù)庫(kù)),或者主動(dòng)的調(diào)用join方法。

      wait和sleep的區(qū)別

      waitsleep
      wait()方法是Object類里的方法sleep()是Thread類的static(靜態(tài))的方法
      wait()睡眠時(shí),釋放對(duì)象鎖sleep()睡眠時(shí),保持對(duì)象鎖,仍然占有該鎖
      常用于線程間通信常用于暫停執(zhí)行
      wait和notify/notifyAll是成對(duì)出現(xiàn)的, 必須在synchronize塊中被調(diào)用

      阻塞狀態(tài)(Blocked)

      在我看來(lái),阻塞狀態(tài)實(shí)際上是相當(dāng)特殊的待機(jī)狀態(tài)。 其他等待線程正在等待其他線程等待使用CPU的權(quán)利。 線程仍然卡住。 即使處理器沒(méi)有處于自由的狀態(tài),它不僅適用于使用主鎖標(biāo)記CPU的權(quán)利,而且也適用鎖標(biāo)記。 (鎖定在下一節(jié):線程同步)

      等待和阻塞的區(qū)別

      等待阻塞
      已經(jīng)拿到鎖對(duì)象,或者說(shuō)不存在拿不到執(zhí)行不了的情況等待拿到鎖對(duì)象
      等待被喚醒等待拿到鎖對(duì)象

      終止線程(Terminated)

      已經(jīng)終止的線程會(huì)處于該種狀態(tài)。



        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(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)論公約

        類似文章 更多