fkjava

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            49 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

           

          在使用java線程的時(shí)候,特別是初學(xué)者總會(huì)有幾點(diǎn)很常見的誤區(qū),下面以以下代碼為例:

             

              線程類:

             

              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());

             

              }

             

              }

             

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

             

              1、誤區(qū)一:認(rèn)為returnThreadInfo對(duì)象中的run方法一定在主類的System.out.printlnreturnThreadInfo.getThreadInfo())之間運(yùn)行。

             

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

             

              如果returnThreadInfo不是一個(gè)線程而是一個(gè)普通類的對(duì)象,那么輸出的結(jié)果是“Hello world,但是正因?yàn)?/span>returnThreadInfo是一個(gè)線程,所以run方法并不一定在System.out.printlnreturnThreadInfo.getThreadInfo())之前運(yùn)行。因?yàn)閷?shí)際上主類Main在運(yùn)行時(shí)也是一個(gè)線程,當(dāng)調(diào)用returnThreadInfo.start()方法來啟動(dòng)returnThreadInfo線程后,此時(shí)系統(tǒng)中運(yùn)行的實(shí)際上就是MainreturnThreadInfo兩個(gè)線程,那么這兩個(gè)線程就會(huì)競爭CPU,誰先搶到CPU的控制權(quán),誰就會(huì)先運(yùn)行(實(shí)際上線程誰能優(yōu)先搶到CPU運(yùn)行時(shí)間是靠優(yōu)先級(jí)來決定的,優(yōu)先級(jí)可以通過線程的setPriorityint newPriority)來設(shè)置,newPriority的取值是1-10,newPriority值越大,線程的優(yōu)先級(jí)就越高,優(yōu)先強(qiáng)占CPU的幾率就越大。線程默認(rèn)的優(yōu)先級(jí)是5)。由于MainreturnThreadInfo的優(yōu)先級(jí)都默認(rèn)為5,所以它們爭搶CPU的幾率是相同的。又因?yàn)?/span>Main線程實(shí)際上是比returnThreadInfo線程先啟動(dòng)的,所以在這個(gè)程序中,MainSystem.out.printlnreturnThreadInfo.getThreadInfo())反而比returnThreadInforun方法更早運(yùn)行,所以輸出的str值還是初始的“Hello.

             

              2、誤區(qū)二:認(rèn)為線程運(yùn)行完畢后,線程消亡的同時(shí),線程對(duì)象也會(huì)一并被回收。

             

              下面對(duì)ReturnThreadInfo類的源代碼進(jìn)行修改,將ReturnThreadInfo線程的優(yōu)先級(jí)設(shè)置為10:

             

              public ReturnThreadInfo() {

             

              this.str = “Hello”;

             

              this.setPriority10);

             

              }

             

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

             

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

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

           信息咨詢:Q564205990          星老師

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

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 上犹县| 钟山县| 河东区| 阿荣旗| 斗六市| 象山县| 河源市| 宣威市| 司法| 娄烦县| 巴林右旗| 谷城县| 西安市| 拉孜县| 德令哈市| 桂东县| 西华县| 神农架林区| 江津市| 旬阳县| 田阳县| 桦甸市| 建德市| 花莲市| 灌阳县| 淅川县| 永靖县| 封开县| 包头市| 惠来县| 嘉义县| 石城县| 玉门市| 颍上县| 临武县| 安宁市| 治多县| 泾源县| 景东| 汪清县| 濉溪县|