隨筆 - 312, 文章 - 14, 評(píng)論 - 1393, 引用 - 0

          導(dǎo)航

          <2009年3月>
          22232425262728
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          公告

          關(guān)注我的新浪微博

          我的著作









          常用鏈接

          留言簿(126)

          我參與的團(tuán)隊(duì)

          隨筆分類(818)

          隨筆檔案(310)

          文章分類(1)

          文章檔案(8)

          相冊(cè)

          ADSL、3G查詢

          CSDN

          eclipse

          ibm

          Java EE

          Linux

          Web

          云服務(wù)

          代理網(wǎng)站

          關(guān)注的網(wǎng)站

          協(xié)議

          喜歡的Blog

          國內(nèi)廣告平臺(tái)

          圖書出版

          在線培訓(xùn)

          開發(fā)工具

          微博客戶端

          手機(jī)鈴聲

          操作系統(tǒng)

          • ReactOS
          • 一個(gè)與windowXP/2003兼容的操作系統(tǒng)

          數(shù)學(xué)

          文件格式

          源碼資源

          移動(dòng)(Mobile)

          編程語言

          英語學(xué)習(xí)

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1974704
          • 排名 - 6

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          Java多線程初學(xué)者指南(2):用Thread類創(chuàng)建線程

          本文為原創(chuàng),如需轉(zhuǎn)載,請(qǐng)注明作者和出處,謝謝!

          上一篇:Java多線程初學(xué)者指南(1):線程簡(jiǎn)介

               Java中創(chuàng)建線程有兩種方法:使用Thread類和使用Runnable接口。在使用Runnable接口時(shí)需要建立一個(gè)Thread實(shí)例。因此,無論是通過Thread類還是Runnable接口建立線程,都必須建立Thread類或它的子類的實(shí)例。Thread類的構(gòu)造方法被重載了八次,構(gòu)造方法如下:

          public Thread( );
          public Thread(Runnable target);
          public Thread(String name);
          public Thread(Runnable target, String name);
          public Thread(ThreadGroup group, Runnable target);
          public Thread(ThreadGroup group, String name);
          public Thread(ThreadGroup group, Runnable target, String name);
          public Thread(ThreadGroup group, Runnable target, String name, long stackSize);

          Runnable target

          實(shí)現(xiàn)了Runnable接口的類的實(shí)例。要注意的是Thread類也實(shí)現(xiàn)了Runnable接口,因此,從Thread類繼承的類的實(shí)例也可以作為target傳入這個(gè)構(gòu)造方法。

          String name

          線程的名子。這個(gè)名子可以在建立Thread實(shí)例后通過Thread類的setName方法設(shè)置。如果不設(shè)置線程的名子,線程就使用默認(rèn)的線程名:Thread-NN是線程建立的順序,是一個(gè)不重復(fù)的正整數(shù)。

          ThreadGroup group

          當(dāng)前建立的線程所屬的線程組。如果不指定線程組,所有的線程都被加到一個(gè)默認(rèn)的線程組中。關(guān)于線程組的細(xì)節(jié)將在后面的章節(jié)詳細(xì)討論。

          long stackSize

              線程棧的大小,這個(gè)值一般是CPU頁面的整數(shù)倍。如x86的頁面大小是4KB。在x86平臺(tái)下,默認(rèn)的線程棧大小是12KB

          一個(gè)普通的Java類只要從Thread類繼承,就可以成為一個(gè)線程類。并可通過Thread類的start方法來執(zhí)行線程代碼。雖然Thread類的子類可以直接實(shí)例化,但在子類中必須要覆蓋Thread類的run方法才能真正運(yùn)行線程的代碼。下面的代碼給出了一個(gè)使用Thread類建立線程的例子:

            001  package mythread;
            
          002  
            
          003  public class Thread1 extends Thread
            
          004  {
            
          005      public void run()
            
          006      {
            
          007          System.out.println(this.getName());
            
          008      }
            
          009      public static void main(String[] args)
            
          010      {
            
          011          System.out.println(Thread.currentThread().getName());
            
          012          Thread1 thread1 = new Thread1();
            
          013          Thread1 thread2 = new Thread1 ();
            
          014          thread1.start();
            
          015          thread2.start();
            
          016      }
            
          017  }


               上面的代碼建立了兩個(gè)線程:thread1和thread2。上述代碼中的005至008行是Thread1類的run方法。當(dāng)在014和015行調(diào)用start方法時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用run方法。在007行使用this.getName()輸出了當(dāng)前線程的名字,由于在建立線程時(shí)并未指定線程名,因此,所輸出的線程名是系統(tǒng)的默認(rèn)值,也就是Thread-n的形式。在011行輸出了主線程的線程名。
              上面代碼的運(yùn)行結(jié)果如下:

          main
          Thread-
          0
          Thread-
          1

          從上面的輸出結(jié)果可以看出,第一行輸出的main是主線程的名子。后面的Thread-1Thread-2分別是thread1thread2的輸出結(jié)果。

          注意:任何一個(gè)Java程序都必須有一個(gè)主線程。一般這個(gè)主線程的名子為main。只有在程序中建立另外的線程,才能算是真正的多線程程序。也就是說,多線程程序必須擁有一個(gè)以上的線程。
              Thread類有一個(gè)重載構(gòu)造方法可以設(shè)置線程名。除了使用構(gòu)造方法在建立線程時(shí)設(shè)置線程名,還可以使用Thread類的setName方法修改線程名。要想通過Thread類的構(gòu)造方法來設(shè)置線程名,必須在Thread的子類中使用Thread類的public Thread(String name)構(gòu)造方法,因此,必須在Thread的子類中也添加一個(gè)用于傳入線程名的構(gòu)造方法。下面的代碼給出了一個(gè)設(shè)置線程名的例子:

            001  package mythread;
            
          002  
            
          003  public class Thread2 extends Thread
            
          004  {
            
          005      private String who;
            
          006  
            
          007      public void run()
            
          008      {
            
          009          System.out.println(who + ":" + this.getName());
            
          010      }
            
          011      public Thread2(String who)
            
          012      {
            
          013          super();
            
          014          this.who = who;
            
          015      }
            
          016      public Thread2(String who, String name)
            
          017      {
            
          018          super(name);
            
          019          this.who = who;
            
          020      }
            
          021      public static void main(String[] args)
            
          022      {
            
          023          Thread2 thread1 = new Thread2 ("thread1""MyThread1");
            
          024          Thread2 thread2 = new Thread2 ("thread2");
            
          025          Thread2 thread3 = new Thread2 ("thread3");
            
          026          thread2.setName("MyThread2");
            
          027          thread1.start();
            
          028          thread2.start();
            
          029          thread3.start();
            
          030      }
            
          031  

          在類中有兩個(gè)構(gòu)造方法:

          011行:public sample2_2(String who)

          這個(gè)構(gòu)造方法有一個(gè)參數(shù):who。這個(gè)參數(shù)用來標(biāo)識(shí)當(dāng)前建立的線程。在這個(gè)構(gòu)造方法中仍然調(diào)用Thread的默認(rèn)構(gòu)造方法public Thread( )

          016行:public sample2_2(String who, String name)

          這個(gè)構(gòu)造方法中的who和第一個(gè)構(gòu)造方法的who的含義一樣,而name參數(shù)就是線程的名名。在這個(gè)構(gòu)造方法中調(diào)用了Thread類的public Thread(String name)構(gòu)造方法,也就是第018行的super(name)

          main方法中建立了三個(gè)線程:thread1thread2thread3。其中thread1通過構(gòu)造方法來設(shè)置線程名,thread2通過setName方法來修改線程名,thread3未設(shè)置線程名。

              運(yùn)行結(jié)果如下:

          thread1:MyThread1
          thread2:MyThread2
          thread3:Thread-
          1

          從上面的輸出結(jié)果可以看出,thread1thread2的線程名都已經(jīng)修改了,而thread3的線程名仍然為默認(rèn)值:Thread-1thread3的線程名之所以不是Thread-2,而是Thread-1,這是因?yàn)樵?/span>026已經(jīng)指定了thread2的Name,因此,啟動(dòng)thread3時(shí)就將thread3的線程名設(shè)為Thread-1因此就會(huì)得到上面的輸出結(jié)果。

          注意:在調(diào)用start方法前后都可以使用setName設(shè)置線程名,但在調(diào)用start方法后使用setName修改線程名,會(huì)產(chǎn)生不確定性,也就是說可能在run方法執(zhí)行完后才會(huì)執(zhí)行setName。如果在run方法中要使用線程名,就會(huì)出現(xiàn)雖然調(diào)用了setName方法,但線程名卻未修改的現(xiàn)象。

          Thread類的start方法不能多次調(diào)用,如不能調(diào)用兩次thread1.start()方法。否則會(huì)拋出一個(gè)IllegalThreadStateException異常。

          下一篇:
          Java多線程初學(xué)者指南(3):使用Runnable接口創(chuàng)建線程





          Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺(tái)灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-03-07 14:06 銀河使者 閱讀(6581) 評(píng)論(5)  編輯  收藏 所屬分類: java 原創(chuàng)多線程

          評(píng)論

          # re: Java多線程初學(xué)者指南(2):用Thread類創(chuàng)建線程  回復(fù)  更多評(píng)論   

          最后一個(gè)例子結(jié)果為
          thread1:MyThread1
          thread2:MyThread2
          thread3:Thread-1

          thread3的線程名之所以不是Thread-0,而是Thread-1,這是因?yàn)樵?24行建立thread2時(shí)已經(jīng)將Thread-0占用了,因此,在025行建立thread3時(shí)就將thread3的線程名設(shè)為Thread-1。然后在026行又將thread2的線程名修改為MyThread2。因此就會(huì)得到上面的輸出結(jié)果。
          2009-03-11 15:05 | guest

          # re: Java多線程初學(xué)者指南(2):用Thread類創(chuàng)建線程  回復(fù)  更多評(píng)論   

          @guest
          是的,這個(gè)結(jié)果寫錯(cuò)了,已經(jīng)改過來了,thank you!
          2009-03-11 16:54 | 銀河使者

          # re: Java多線程初學(xué)者指南(2):用Thread類創(chuàng)建線程  回復(fù)  更多評(píng)論   

          摟主你只改了結(jié)果,下面的說明還沒有改阿!

          因?yàn)樵赥hread2 thread1 = new Thread2 ("thread1", "MyThread1");

          對(duì)象產(chǎn)生時(shí),名字就已經(jīng)給了,所以就不會(huì)產(chǎn)生默認(rèn)的名字了!

          不改好,讀起來會(huì)很莫名其妙的。。。
          2009-03-11 18:13 | yxc

          # re: Java多線程初學(xué)者指南(2):用Thread類創(chuàng)建線程  回復(fù)  更多評(píng)論   

          是因?yàn)閠hread1和thread2都指定了Name,所有thread3就是Thread-1了。
          2009-03-11 19:11 | 銀河使者

          # re: Java多線程初學(xué)者指南(2):用Thread類創(chuàng)建線程  回復(fù)  更多評(píng)論   

          我就不信不可以
          2011-05-14 23:53 | cheap sunglasses
          主站蜘蛛池模板: 鄂托克前旗| 宝兴县| 政和县| 乐清市| 林州市| 新津县| 株洲市| 文水县| 枣庄市| 肥西县| 神农架林区| 浪卡子县| 东海县| 青神县| 富平县| 融水| 皮山县| 馆陶县| 襄城县| 阜南县| 缙云县| 宁明县| 九江市| 伊金霍洛旗| 七台河市| 石家庄市| 启东市| 九江县| 翁牛特旗| 额济纳旗| 宜兰市| 南康市| 清涧县| 漳浦县| 岳普湖县| 寻乌县| 龙门县| 曲水县| 海兴县| 海盐县| 邵阳市|