lbom

          小江西

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            18 隨筆 :: 21 文章 :: 69 評(píng)論 :: 0 Trackbacks

          在一次基于多線程的編碼測(cè)試中,發(fā)現(xiàn)繼承Runnable接口的線程實(shí)現(xiàn)類在運(yùn)行時(shí)并未按預(yù)計(jì)啟動(dòng)多線程,經(jīng)分析和比較后,找出問(wèn)題所現(xiàn),現(xiàn)將其記錄下來(lái),以供分享。

          Java中,多線程編程中的線程編寫,有兩種方式,即擴(kuò)展Thread基類或繼承Runnable接口;例如:

          public class T extends Thread {

          public void run() {

          ……

          }

          }

          public class R implements Runnable {

          public void run() {

          ……

          }

          }

          對(duì)于擴(kuò)展Thread的實(shí)現(xiàn)類T,可以使用T.start()來(lái)啟動(dòng)此線程;如

          public static void main(String[] args) {

          Thread t = new T();

          t.start();

          }

          但對(duì)于繼承Runnable接口的實(shí)現(xiàn)類R,因接口中并沒(méi)有提供直接啟動(dòng)線程的start()方法,只有一個(gè)線程主邏輯運(yùn)行的run()方法。此時(shí),如執(zhí)行run(),會(huì)因?yàn)镽.run()只是作為此線程實(shí)現(xiàn)類的一個(gè)方法,并未在主線程之外,啟動(dòng)另一個(gè)線程,從而導(dǎo)致R.run()阻斷主線程繼續(xù)向下執(zhí)行;并未達(dá)到多線程運(yùn)行的目的。

          錯(cuò)誤啟動(dòng)代碼如下:

          public static void main(String[] args) {

          R r = new R();

          r.run();

          }

          那么,如何使用另外線程來(lái)啟動(dòng)繼承Runnable接口的實(shí)現(xiàn)類呢?以下就是它的正確的使用方式:

          public static void main(String[] args) {

          R r = new R();

          Thread t = new Thread(r);

          t.start();

          }

          此時(shí),需注意,在主線程執(zhí)行時(shí),需等待子線程執(zhí)行,否則,當(dāng)主線程結(jié)束后,子線程也將結(jié)束。

          posted on 2010-03-10 16:48 lbom 閱讀(1583) 評(píng)論(2)  編輯  收藏

          評(píng)論

          # re: Thread & Runnable[未登錄](méi) 2010-03-12 19:34 feenn
          不應(yīng)該出現(xiàn)這種低級(jí)錯(cuò)誤,建議應(yīng)該從理解入手,而不是只知道調(diào)用API。  回復(fù)  更多評(píng)論
            

          # re: Thread & Runnable 2010-03-13 15:06 隔葉黃鶯
          說(shuō)到多線程一般都會(huì)說(shuō) Thread 和 Runnable,代碼表現(xiàn)即為:

          1:new Thread(){
          public void run(){
          //do something......
          }
          }.start();

          2:new Thread(new Runnable(){
          public void run(){
          //do something......
          }
          }).start();

          其實(shí)了解到 Thread 與 Runnable 是一種實(shí)現(xiàn)關(guān)系就知道以上兩種方式其實(shí)是一回事,究底來(lái)說(shuō) run() 方法都是由 Runnable 接口來(lái)約定的,要用 start() 方法來(lái)啟動(dòng)線程,要跑的方法追到頭還是 Runnable 接口中的 run() 方法。  回復(fù)  更多評(píng)論
            


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 肥城市| 闸北区| 龙海市| 咸丰县| 北票市| 益阳市| 修文县| 屯门区| 获嘉县| 孝感市| 宝应县| 栖霞市| 嘉荫县| 乌拉特后旗| 南和县| 旬阳县| 颍上县| 虎林市| 旺苍县| 都昌县| 托克逊县| 宁乡县| 北辰区| 济源市| 泾阳县| 和平县| 汽车| 广德县| 郁南县| 碌曲县| 兰西县| 巢湖市| 越西县| 甘孜县| 石屏县| 华池县| 凤冈县| 广元市| 莱西市| 永康市| 峡江县|