導(dǎo)航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789
          統(tǒng)計
          • 隨筆 - 2
          • 文章 - 0
          • 評論 - 1
          • 引用 - 0

          常用鏈接

          留言簿(1)

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           

          2005年8月4日

          轉(zhuǎn)載:轉(zhuǎn)載請保留本信息,本文來自http://www.matrix.org.cn/resource/article/194.html

          線程是Java的一大特性,它可以是給定的指令序列、給定的方法中定義的變量或者一些共享數(shù)據(jù)(類一級的變量)。在Java中每個線程有自己的堆棧和程序計數(shù)器(PC),其中堆棧是用來跟蹤線程的上下文(上下文是當(dāng)線程執(zhí)行到某處時,當(dāng)前的局部變量的值),而程序計數(shù)器則用來跟蹤當(dāng)前線程正在執(zhí)行的指令。

          在通常情況下,一個線程不能訪問另外一個線程的堆棧變量,而且這個線程必須處于如下狀態(tài)之一:

          1.
          排隊狀態(tài)(Ready),在用戶創(chuàng)建了一個線程以后,這個線程不會立即運行。當(dāng)線程中的方法start()被調(diào)用時,這個線程就會進行排隊狀態(tài),等待調(diào)度程序?qū)⑺D(zhuǎn)入運行狀態(tài)(Running)。當(dāng)一個進程被執(zhí)行后它也可以進行排隊狀態(tài)。如果調(diào)度程序允許的話,通過調(diào)用方法yield()就可以將進程放入排隊狀態(tài)。

          2.
          運行狀態(tài)(Running),當(dāng)調(diào)度程序?qū)?/SPAN>CPU的運行時間分配給一個線程,這個線程就進入了運行狀態(tài)開始運行。

          3.
          等待狀態(tài)(Waiting),很多原因都可以導(dǎo)致線程處于等待狀態(tài),例如線程執(zhí)行過程中被暫停,或者是等待I/O請求的完成而進入等待狀態(tài)。

          Java中不同的線程具有不同的優(yōu)先級,高優(yōu)先級的線程可以安排在低優(yōu)先級線程之前完成。如果多個線程具有相同的優(yōu)先級,Java會在不同的線程之間切換運行。一個應(yīng)用程序可以通過使用線程中的方法setPriority()來設(shè)置線程的優(yōu)先級,使用方法getPriority()來獲得一個線程的優(yōu)先級。


          線程的生命周期


          一個線程的的生命周期可以分成兩階段:生存(Alive)周期和死亡(Dead)周期,其中生存周期又包括運行狀態(tài)(Running)和等待狀態(tài)(Waiting)。當(dāng)創(chuàng)建一個新線程后,這個線程就進入了排隊狀態(tài)(Ready),當(dāng)線程中的方法start()被調(diào)用時,線程就進入生存周期,這時它的方法isAlive()始終返回真值,直至線程進入死亡狀態(tài)。


          線程的實現(xiàn)


          有兩種方法可以實現(xiàn)線程,一種是擴展java.lang.Thread類,另一種是通過java.lang.Runnable接口。

          Thread
          類封裝了線程的行為。要創(chuàng)建一個線程,必須創(chuàng)建一個從Thread類擴展出的新類。由于在Thread類中方法run()沒有提供任何的操作,因此,在創(chuàng)建線程時用戶必須覆蓋方法run()來完成有用的工作。當(dāng)線程中的方法start()被調(diào)用時,方法run()再被調(diào)用。下面的代碼就是通過擴展Thread類來實現(xiàn)線程:

          import java.awt.*;
          class Sample1{
          public static void main(String[] args){
          Mythread test1=new Mythread(1);
          Mythread test2=new Mythread(2);
          test1.start();
          test2.start();
          }
          }
          class Mythread extends Thread {
          int id;
          Mythread(int i)
          { id=i;}
          public void run() {
          int i=0;
          while(id+i==1){
          try {sleep(1000);
          } catch(InterruptedException e) {}
          }
          System.out.println(“The id is ”+id);
          }



          通常當(dāng)用戶希望一個類能運行在自己的線程中,同時也擴展其它某些類的特性時,就需要借助運行Runnable接口來實現(xiàn)。Runnable接口只有一個方法run()。不論什么時候創(chuàng)建了一個使用Runnable接口的類,都必須在類中編寫run()方法來覆蓋接口中的run()方法。例如下面的代碼就是通過Runnable接口實現(xiàn)的線程:

          import java.awt.*;
          import java.applet.Applet;
          public class Bounce extends Applet implements Runnable{
          static int r=30;
          static int x=100;
          static int y=30;
          Thread t;
          public void init()
          {
          t = new Thread(this);
          t.start();
          }
          public void run()
          {
          int y1=+1;
          int i=1;
          int sleeptime=10;
          while(true)
          {
          y+=(i*y);
          if(y-r<i ||y+r>getSize().height)
          y1*=-1;
          try{
          t.sleep(sleeptime);
          }catch(InterruptedException e){ }
          }
          }
          }




          為什么要使用線程池


          Java中,如果每當(dāng)一個請求到達就創(chuàng)建一個新線程,開銷是相當(dāng)大的。在實際使用中,每個請求創(chuàng)建新線程的服務(wù)器在創(chuàng)建和銷毀線程上花費的時間和消耗的系統(tǒng)資源,甚至可能要比花在處理實際的用戶請求的時間和資源要多得多。除了創(chuàng)建和銷毀線程的開銷之外,活動的線程也需要消耗系統(tǒng)資源。如果在一個JVM里創(chuàng)建太多的線程,可能會導(dǎo)致系統(tǒng)由于過度消耗內(nèi)存或切換過度而導(dǎo)致系統(tǒng)資源不足。為了防止資源不足,服務(wù)器應(yīng)用程序需要一些辦法來限制任何給定時刻處理的請求數(shù)目,盡可能減少創(chuàng)建和銷毀線程的次數(shù),特別是一些資源耗費比較大的線程的創(chuàng)建和銷毀,盡量利用已有對象來進行服務(wù),這就是池化資源技術(shù)產(chǎn)生的原因。

          線程池主要用來解決線程生命周期開銷問題和資源不足問題。通過對多個任務(wù)重用線程,線程創(chuàng)建的開銷就被分?jǐn)偟搅硕鄠€任務(wù)上了,而且由于在請求到達時線程已經(jīng)存在,所以消除了線程創(chuàng)建所帶來的延遲。這樣,就可以立即為請求服務(wù),使應(yīng)用程序響應(yīng)更快。另外,通過適當(dāng)?shù)卣{(diào)整線程池中的線程數(shù)目可以防止出現(xiàn)資源不足的情況。


          創(chuàng)建一個線程池


          一個比較簡單的線程池至少應(yīng)包含線程池管理器、工作線程、任務(wù)隊列、任務(wù)接口等部分。其中線程池管理器(ThreadPool Manager)的作用是創(chuàng)建、銷毀并管理線程池,將工作線程放入線程池中;工作線程是一個可以循環(huán)執(zhí)行任務(wù)的線程,在沒有任務(wù)時進行等待;任務(wù)隊列的作用是提供一種緩沖機制,將沒有處理的任務(wù)放在任務(wù)隊列中;任務(wù)接口是每個任務(wù)必須實現(xiàn)的接口,主要用來規(guī)定任務(wù)的入口、任務(wù)執(zhí)行完后的收尾工作、任務(wù)的執(zhí)行狀態(tài)等,工作線程通過該接口調(diào)度任務(wù)的執(zhí)行。下面的代碼實現(xiàn)了創(chuàng)建一個線程池,以及從線程池中取出線程的操作:

          public class ThreadPool
          {
          private Stack threadpool = new Stack();
          private int poolSize;
          private int currSize=0;
          public void setSize(int n)
          {
          poolSize = n;
          }
          public void run()
          {
          for(int i=0;i<poolSize;i++)
          {
          WorkThread workthread=new WorkThread();
          threadpool.push(workthread);
          currSize++;
          }
          }
          public synchronized WorkThread getworker( )
          {
          if (threadpool.empty())
          system.out.println(“stack is empty”);
          else
          try{ return threadpool.pop();
          } catch (EmptyStackException e){}
          }
          }




          線程池適合應(yīng)用的場合


          當(dāng)一個Web服務(wù)器接受到大量短小線程的請求時,使用線程池技術(shù)是非常合適的,它可以大大減少線程的創(chuàng)建和銷毀次數(shù),提高服務(wù)器的工作效率。但如果線程要求的運行時間比較長,此時線程的運行時間比創(chuàng)建時間要長得多,單靠減少創(chuàng)建時間對系統(tǒng)效率的提高不明顯,此時就不適合應(yīng)用線程池技術(shù),需要借助其它的技術(shù)來提高服務(wù)器的服務(wù)效率。

          posted @ 2005-08-04 14:19 專注java分布式 閱讀(270) | 評論 (0)編輯 收藏

          2005年8月3日

          ??? 1.安裝JacORB
          解壓縮,會生成一個新的目錄JacORB。然后將JacORB/lib/jacorb.jar(classpath) 中。如果你想重新編譯JacORB,也不要忘記將JacORB/class 加入類路徑,并且將JacORB/bin加到Path,在JacORB/bin下有一些實用程序。
          重新編譯JacORB(以及JacORB附帶的例子)需要安裝AntAnt是基于XML的制作管理工具。要重新編譯JacORB,只需在安裝目錄(JacORB) 中輸入ant命令即可。在執(zhí)行 ant 命令之前,可以執(zhí)行 ant clean 來清除上次編譯產(chǎn)生的中間文件。
          2. 配置JacORB
          X:JacORBetc 文件夾下的 jacorb_properties.template 文件改名為 jacorb.properties ,然后復(fù)制到類路徑中。
          設(shè)置 ORBInitRef.NameService 參數(shù)
          3.JBuilder
          中的設(shè)置
          I.
          JacORB/lib 加入類路徑
          II. Tools->Enterprise Setup->CORBA->NEW
          其中 Path for ORB tools: X:/JacORB/bin
          IDL compiler command: idl.bat
          Command option for output directory: -d
          III. Project->Project Properties->Paths
          JacORB/lib 加入Required Libraries
          IV. Project->Project Properties->IDL
          其中 IDL compiler: 選擇第二步新建的compiler
          Additional options: -ami_callback
          V.
          在需要編譯的idl文件上單擊鼠標(biāo)右鍵,選擇Properties,Process this IDL file 的選項上打勾
          VI. Rebuild Project
          即可。

          注意:執(zhí)行程序時必須指定vm參數(shù)-Djava.endorsed.dirs="E:\JacORB\lib" (JBuilderProject Properties 里的Runtime Configuration里設(shè)置)

          posted @ 2005-08-03 14:42 專注java分布式 閱讀(483) | 評論 (1)編輯 收藏
          僅列出標(biāo)題  
           
          主站蜘蛛池模板: 梁河县| 德保县| 杭锦后旗| 库尔勒市| 敦煌市| 许昌县| 镇沅| 伊川县| 卓尼县| 洛阳市| 陇川县| 萨迦县| 吉木乃县| 外汇| 佳木斯市| 尉犁县| 辰溪县| 长岛县| 根河市| 玛沁县| 汶上县| 梨树县| 江口县| 深圳市| 元氏县| 龙里县| 铜山县| 梅州市| 南投县| 绥德县| 潞城市| 东莞市| 策勒县| 绥中县| 仙桃市| 攀枝花市| 油尖旺区| 齐齐哈尔市| 图木舒克市| 杭锦后旗| 临猗县|