国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java學(xué)習(xí)日記(線程)

2019-11-17 06:33:47
字體:
供稿:網(wǎng)友

一、線程的概念:
    線程與進(jìn)程相似,是一段完成某個(gè)特定功能的代碼,是程序中單個(gè)順序的流控制;但與進(jìn)程不同的是,同類的多個(gè)線程是共享一塊內(nèi)存空間和一組系統(tǒng)資源,而線程本身的數(shù)據(jù)通常只有微處理器的寄存器數(shù)據(jù),以及一個(gè)供程序執(zhí)行時(shí)使用的堆棧。所以系統(tǒng)在產(chǎn)生一個(gè)線程,或者在各個(gè)線程之間切換時(shí),負(fù)擔(dān)要比進(jìn)程小的多,正因如此,線程被稱為輕負(fù)荷進(jìn)程(light-weight PRocess)。一個(gè)進(jìn)程中可以包含多個(gè)線程。

    一個(gè)線程是一個(gè)程序內(nèi)部的順序控制流。
  1. 進(jìn)程:每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(進(jìn)程上下文) ,進(jìn)程切換的開銷大。
  2. 線程:輕量的進(jìn)程,同一類線程共享代碼和數(shù)據(jù)空間,每個(gè)線程有獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),線程切換的開銷小。
  3. 多進(jìn)程:在操作系統(tǒng)中,能同時(shí)運(yùn)行多個(gè)任務(wù)程序。
  4. 多線程:在同一應(yīng)用程序中,有多個(gè)順序流同時(shí)執(zhí)行。

    java內(nèi)在支持多線程,它的所有類都是在多線程下定義的,Java利用多線程使整個(gè)系統(tǒng)成為異步系統(tǒng)。
  1. 虛擬的CPU,封裝在java.lang.Thread類中。
  2. CPU所執(zhí)行的代碼,傳遞給Thread類。
  3. CPU所處理的數(shù)據(jù),傳遞給Thread類。

二、線程的構(gòu)造
    線程實(shí)例表示Java解釋器中的真正的線程,通過它可以啟動(dòng)線程、終止線程、線程掛起等,每個(gè)線程都是通過類Thread在Java的軟件包Java.lang中定義,它的構(gòu)造方法為:

   public Thread (ThreadGroup group,Runnable target,String name);

  其中,group 指明該線程所屬的線程組;target實(shí)際執(zhí)行線程體的目標(biāo)對(duì)象,它必須實(shí)現(xiàn)接口Runnable; name為線程名。Java中的每個(gè)線程都有自己的名稱,Java提供了不同Thread類構(gòu)造器,答應(yīng)給線程指定名稱。假如name為null時(shí),則Java自動(dòng)提供唯一的名稱。
當(dāng)上述構(gòu)造方法的某個(gè)參數(shù)為null時(shí),我們可得到下面的幾個(gè)構(gòu)造方法:

  public Thread ();
  public Thread (Runnable target);
  public Thread (Runnable target,String name);
  public Thread (String name);
  public Thread (ThreadGroup group,Runnable target);
  public Thread (ThreadGroup group,String name);

  一個(gè)類聲明實(shí)現(xiàn)Runnable接口就可以充當(dāng)線程體,在接口Runnable中只定義了一個(gè)方法 run():
       public void run();

  任何實(shí)現(xiàn)接口Runnable的對(duì)象都可以作為一個(gè)線程的目標(biāo)對(duì)象,類Thread本身也實(shí)現(xiàn)了接口Runnable,因此我們可以通過兩種方法實(shí)現(xiàn)線程體。

  (一)定義一個(gè)線程類,它繼續(xù)線程類Thread并重寫其中的方法 run(),這時(shí)在初始化這個(gè)類的實(shí)例時(shí),目標(biāo)target可為null,表示由這個(gè)實(shí)例對(duì)來執(zhí)行線程體。由于Java只支持單重繼續(xù),用這種方法定義的類不能再繼續(xù)其它父類。

 ?。ǘ┨峁┮粋€(gè)實(shí)現(xiàn)接口Runnable的類作為一個(gè)線程的目標(biāo)對(duì)象,在初始化一個(gè)Thread類或者Thread子類的線程對(duì)象時(shí),把目標(biāo)對(duì)象傳遞給這個(gè)線程實(shí)例,由該目標(biāo)對(duì)象提供線程體 run()。這時(shí),實(shí)現(xiàn)接口Runnable的類仍然可以繼續(xù)其它父類。

 

三、線程的狀態(tài)
  每個(gè)線程都是通過某個(gè)特定Thread對(duì)象的方法run( )來完成其操作的,方法run( )稱為線程體。下圖表示了java線程的不同狀態(tài)以及狀態(tài)之間轉(zhuǎn)換所調(diào)用的方法。
   
    1. 創(chuàng)建狀態(tài)(new Thread)
  執(zhí)行下列語句時(shí),線程就處于創(chuàng)建狀態(tài):
  Thread myThread = new Thread( );
  當(dāng)一個(gè)線程處于創(chuàng)建狀態(tài)時(shí),它僅僅是一個(gè)空的線程對(duì)象,系統(tǒng)不為它分配資源。

  2. 可運(yùn)行狀態(tài)( Runnable )
  Thread myThread = new Thread( );
  myThread.start( );
  當(dāng)一個(gè)線程處于可運(yùn)行狀態(tài)時(shí),系統(tǒng)為這個(gè)線程分配了它需的系統(tǒng)資源,安排其運(yùn)行并調(diào)用線程運(yùn)行方法,這樣就使得該線程處于可運(yùn)行( Runnable )狀態(tài)。需要注重的是這一狀態(tài)并不是運(yùn)行中狀態(tài)(Running ),因?yàn)榫€程也許實(shí)際上并未真正運(yùn)行。由于很多計(jì)算機(jī)都是單處理器的,所以要在同一時(shí)刻運(yùn)行所有的處于可運(yùn)行狀態(tài)的線程是不可能的,Java的運(yùn)行系統(tǒng)必須實(shí)現(xiàn)調(diào)度來保證這些線程共享處理器。
  
  3. 不可運(yùn)行狀態(tài)(Not Runnable)
  進(jìn)入不可運(yùn)行狀態(tài)的原因有如下幾條:
  1) 調(diào)用了sleep()方法;
  2) 調(diào)用了suspend()方法;
  3) 為等候一個(gè)條件變量,線程調(diào)用wait()方法;
  4) 輸入輸出流中發(fā)生線程阻塞;
  不可運(yùn)行狀態(tài)也稱為阻塞狀態(tài)(Blocked)。因?yàn)槟撤N原因(輸入/輸出、等待消息或其它阻塞情況),系統(tǒng)不能執(zhí)行線程的狀態(tài)。這時(shí)即使處理器空閑,也不能執(zhí)行該線程。

  4. 死亡狀態(tài)(Dead)
  線程的終止一般可通過兩種方法實(shí)現(xiàn):自然撤消(線程執(zhí)行完)或是被停止(調(diào)用stop()方法)。目前不推薦通過調(diào)用stop()來終止線程的執(zhí)行,而是讓線程執(zhí)行完。


四、有關(guān)線程的一些長(zhǎng)用的方法
     1. sleep(long millis)
     這個(gè)方法是一個(gè)靜態(tài)的方法,也就是說我們可以直接調(diào)用它,如Thread.sleep(5000)就是指讓目前正在運(yùn)行的線程先停下工作等待5000毫秒。有一點(diǎn)需要注重的是:不能肯定這個(gè)線程在過5000毫秒肯定會(huì)馬上被執(zhí)行。

     2.interrupt()


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 金华市| 施秉县| 德阳市| 章丘市| 资中县| 基隆市| 澳门| 尖扎县| 北辰区| 水富县| 德化县| 万全县| 延长县| 西安市| 元朗区| 太原市| 崇阳县| 汉寿县| 南江县| 广元市| 宜兰县| 即墨市| 河津市| 大邑县| 漳浦县| 福贡县| 蓝山县| 镇安县| 商城县| 广宗县| 万州区| 鄯善县| 岱山县| 东阿县| 水富县| 光泽县| 三江| 舞阳县| 湟源县| 钦州市| 云霄县|