隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0

          導航

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

          公告

          關注我的新浪微博

          我的著作









          常用鏈接

          留言簿(126)

          我參與的團隊

          隨筆分類(818)

          隨筆檔案(310)

          文章分類(1)

          文章檔案(8)

          相冊

          ADSL、3G查詢

          CSDN

          eclipse

          ibm

          Java EE

          Linux

          Web

          云服務

          代理網站

          關注的網站

          協議

          喜歡的Blog

          國內廣告平臺

          圖書出版

          在線培訓

          開發工具

          微博客戶端

          手機鈴聲

          操作系統

          • ReactOS
          • 一個與windowXP/2003兼容的操作系統

          數學

          文件格式

          源碼資源

          移動(Mobile)

          編程語言

          英語學習

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1973206
          • 排名 - 6

          最新評論

          閱讀排行榜

          評論排行榜

          Java多線程初學者指南(2):用Thread類創建線程

          本文為原創,如需轉載,請注明作者和出處,謝謝!

          上一篇:Java多線程初學者指南(1):線程簡介

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

          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

          實現了Runnable接口的類的實例。要注意的是Thread類也實現了Runnable接口,因此,從Thread類繼承的類的實例也可以作為target傳入這個構造方法。

          String name

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

          ThreadGroup group

          當前建立的線程所屬的線程組。如果不指定線程組,所有的線程都被加到一個默認的線程組中。關于線程組的細節將在后面的章節詳細討論。

          long stackSize

              線程棧的大小,這個值一般是CPU頁面的整數倍。如x86的頁面大小是4KB。在x86平臺下,默認的線程棧大小是12KB

          一個普通的Java類只要從Thread類繼承,就可以成為一個線程類。并可通過Thread類的start方法來執行線程代碼。雖然Thread類的子類可以直接實例化,但在子類中必須要覆蓋Thread類的run方法才能真正運行線程的代碼。下面的代碼給出了一個使用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  }


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

          main
          Thread-
          0
          Thread-
          1

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

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

            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  

          在類中有兩個構造方法:

          011行:public sample2_2(String who)

          這個構造方法有一個參數:who。這個參數用來標識當前建立的線程。在這個構造方法中仍然調用Thread的默認構造方法public Thread( )

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

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

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

              運行結果如下:

          thread1:MyThread1
          thread2:MyThread2
          thread3:Thread-
          1

          從上面的輸出結果可以看出,thread1thread2的線程名都已經修改了,而thread3的線程名仍然為默認值:Thread-1thread3的線程名之所以不是Thread-2,而是Thread-1,這是因為在026已經指定了thread2的Name,因此,啟動thread3時就將thread3的線程名設為Thread-1因此就會得到上面的輸出結果。

          注意:在調用start方法前后都可以使用setName設置線程名,但在調用start方法后使用setName修改線程名,會產生不確定性,也就是說可能在run方法執行完后才會執行setName。如果在run方法中要使用線程名,就會出現雖然調用了setName方法,但線程名卻未修改的現象。

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

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





          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          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 銀河使者 閱讀(6574) 評論(5)  編輯  收藏 所屬分類: java 原創多線程

          評論

          # re: Java多線程初學者指南(2):用Thread類創建線程  回復  更多評論   

          最后一個例子結果為
          thread1:MyThread1
          thread2:MyThread2
          thread3:Thread-1

          thread3的線程名之所以不是Thread-0,而是Thread-1,這是因為在024行建立thread2時已經將Thread-0占用了,因此,在025行建立thread3時就將thread3的線程名設為Thread-1。然后在026行又將thread2的線程名修改為MyThread2。因此就會得到上面的輸出結果。
          2009-03-11 15:05 | guest

          # re: Java多線程初學者指南(2):用Thread類創建線程  回復  更多評論   

          @guest
          是的,這個結果寫錯了,已經改過來了,thank you!
          2009-03-11 16:54 | 銀河使者

          # re: Java多線程初學者指南(2):用Thread類創建線程  回復  更多評論   

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

          因為在Thread2 thread1 = new Thread2 ("thread1", "MyThread1");

          對象產生時,名字就已經給了,所以就不會產生默認的名字了!

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

          # re: Java多線程初學者指南(2):用Thread類創建線程  回復  更多評論   

          是因為thread1和thread2都指定了Name,所有thread3就是Thread-1了。
          2009-03-11 19:11 | 銀河使者

          # re: Java多線程初學者指南(2):用Thread類創建線程  回復  更多評論   

          我就不信不可以
          2011-05-14 23:53 | cheap sunglasses
          主站蜘蛛池模板: 肥东县| 曲周县| 莎车县| 新竹市| 泽普县| 汶上县| 子长县| 天长市| 遂川县| 东丽区| 伊川县| 张家界市| 肇东市| 太谷县| 永春县| 韶山市| 梧州市| 汝城县| 长宁区| 临泽县| 通州区| 赫章县| 新干县| 时尚| 乌鲁木齐县| 怀远县| 溧阳市| 玉溪市| 资溪县| 聂荣县| 海伦市| 英德市| 寿阳县| 岱山县| 九龙坡区| 泗水县| 白河县| 徐汇区| 宿州市| 许昌县| 龙南县|