fkjava

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            49 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

           

          在使用java線程的時候,特別是初學者總會有幾點很常見的誤區,下面以以下代碼為例:

             

              線程類:

             

              package threadtest1;

             

              public class ReturnThreadInfo extends Thread {

             

              private String str;

             

              public ReturnThreadInfo() {

             

              this.str = “Hello”;

             

              }

             

              public void run(){

             

              try{

             

              this.str = “Hello World!”;

             

              }catchException ex{

             

              }

             

              }

             

              /*返回線程信息:str變量的值*/

             

              public String getThreadInfo(){

             

              return this.str;

             

              }

             

              }

              

              主類:

             

              package threadtest1;

             

              public class Main extends Thread {

             

              public Main() {

             

              }

             

              public static void mainString[] args {

             

              ReturnThreadInfo returnThreadInfo = new ReturnThreadInfo();

             

              returnThreadInfo.start();

             

              System.out.printlnreturnThreadInfo.getThreadInfo());

             

              }

             

              }

             

              大家可以看到這個程序主要功能是返回線程returnThreadInfo對象的變量str的值并輸出,那么str的值到底是什么,一些人可能會認為是“Hello world!”或是null,其實如果大家運行下就會知道輸出的str的值實際是“Hello.為什么呢?其實認為輸出結果是“Hello world”或是null的人存在著兩個比較常見的誤區:

             

              1、誤區一:認為returnThreadInfo對象中的run方法一定在主類的System.out.printlnreturnThreadInfo.getThreadInfo())之間運行。

             

              這是比較常見的一個誤區,稍微了解一些java編譯原理的人應該清楚,java源文件的代碼編譯是自上而下的,也就是處在同一文件上面的代碼會在下面的代碼之間被編譯和運行。所以很多人認為returnThreadInfo.start()先被運行,returnThreadInfo線程被啟動,然后run()方法被調用,str被賦值:“hello world!,然后線程結束并返回到主類,最后調用System.out.printlnreturnThreadInfo.getThreadInfo())將str的值輸出就是“Hello world!.

             

              如果returnThreadInfo不是一個線程而是一個普通類的對象,那么輸出的結果是“Hello world,但是正因為returnThreadInfo是一個線程,所以run方法并不一定在System.out.printlnreturnThreadInfo.getThreadInfo())之前運行。因為實際上主類Main在運行時也是一個線程,當調用returnThreadInfo.start()方法來啟動returnThreadInfo線程后,此時系統中運行的實際上就是MainreturnThreadInfo兩個線程,那么這兩個線程就會競爭CPU,誰先搶到CPU的控制權,誰就會先運行(實際上線程誰能優先搶到CPU運行時間是靠優先級來決定的,優先級可以通過線程的setPriorityint newPriority)來設置,newPriority的取值是1-10,newPriority值越大,線程的優先級就越高,優先強占CPU的幾率就越大。線程默認的優先級是5)。由于MainreturnThreadInfo的優先級都默認為5,所以它們爭搶CPU的幾率是相同的。又因為Main線程實際上是比returnThreadInfo線程先啟動的,所以在這個程序中,MainSystem.out.printlnreturnThreadInfo.getThreadInfo())反而比returnThreadInforun方法更早運行,所以輸出的str值還是初始的“Hello.

             

              2、誤區二:認為線程運行完畢后,線程消亡的同時,線程對象也會一并被回收。

             

              下面對ReturnThreadInfo類的源代碼進行修改,將ReturnThreadInfo線程的優先級設置為10:

             

              public ReturnThreadInfo() {

             

              this.str = “Hello”;

             

              this.setPriority10);

             

              }

             

              這樣returnThreadInfo線程的run()方法就會在Main類的System.out.printlnreturnThreadInfo.getThreadInfo())語句之前被運行。因此有很多人會認為當returnThreadInfo線程的run()方法運行完畢并返回后,線程就會死亡,那么Main類的最后一句System.out.printlnreturnThreadInfo.getThreadInfo())就會出問題,等于調用了已經不存在的對象:returnThreadInfo.

             

          實際上這存在著很大的一個誤區,線程的死亡并不意味著線程對象的銷毀和回收。線程的死亡指的是當線程的run方法結束后,該線程就無法被重用和啟動,但它的對象還存在并且它的屬性和方法還一樣可以被使用,因此System.out.printlnreturnThreadInfo.getThreadInfo())輸出的并不是NULL而是“Hello World!,只有當整個應用程序都結束后,returnT

           您正在看的文章來自瘋狂軟件教育中心 www.fkjava.org

           信息咨詢:Q564205990          星老師

          posted on 2012-08-24 16:45 瘋狂軟件 閱讀(146) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 界首市| 海伦市| 仁怀市| 蒙山县| 扶余县| 崇礼县| 象山县| 托克逊县| 邯郸县| 阿拉尔市| 星子县| 翁牛特旗| 社会| 博罗县| 盐山县| 平江县| 杭锦旗| 永丰县| 湟源县| 绥滨县| 宜良县| 准格尔旗| 广州市| 札达县| 永和县| 莲花县| 邹城市| 潞城市| 平定县| 杭州市| 五河县| 民权县| 漳平市| 平顶山市| 阳谷县| 茶陵县| 伊春市| 邢台县| 措美县| 彭泽县| 元朗区|