lbom

          小江西

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

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

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

          public class T extends Thread {

          public void run() {

          ……

          }

          }

          public class R implements Runnable {

          public void run() {

          ……

          }

          }

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

          public static void main(String[] args) {

          Thread t = new T();

          t.start();

          }

          但對(duì)于繼承Runnable接口的實(shí)現(xiàn)類(lèi)R,因接口中并沒(méi)有提供直接啟動(dòng)線程的start()方法,只有一個(gè)線程主邏輯運(yùn)行的run()方法。此時(shí),如執(zhí)行run(),會(huì)因?yàn)镽.run()只是作為此線程實(shí)現(xiàn)類(lèi)的一個(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)類(lèi)呢?以下就是它的正確的使用方式:

          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 閱讀(1591) 評(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è)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 青河县| 通许县| 潮安县| 岐山县| 绥芬河市| 中宁县| 翼城县| 石城县| 景洪市| 都兰县| 泸西县| 崇左市| 鲁山县| 吉水县| 丹东市| 泾川县| 岳阳县| 杭州市| 涞源县| 韩城市| 罗田县| 陈巴尔虎旗| 长岭县| 金阳县| 抚松县| 小金县| 江阴市| 微博| 石棉县| 新建县| 广汉市| 盘山县| 上饶市| 南宁市| 正宁县| 彭水| 怀来县| 伊金霍洛旗| 武平县| 胶南市| 祁门县|