【原創】Java多執行緒初學者指南(2):用Thread類建立執行緒
本文為原創,如需轉載,請註明作者和出處,謝謝!
在Java中建立執行緒有兩種方法:使用Thread類和使用Runnable介面。在使用Runnable介面時需要建立一個Thread例項。因此,無論是通過Thread類還是Runnable介面建立執行緒,都必須建立Thread類或它的子類的例項。Thread類的構造方法被過載了八次,構造方法如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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);
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
實現了Runnable介面的類的例項。要注意的是Thread類也實現了Runnable介面,因此,從Thread類繼承的類的例項也可以作為target傳入這個構造方法。
String name
執行緒的名子。這個名子可以在建立Thread例項後通過Thread類的setName方法設定。如果不設定執行緒的名子,執行緒就使用預設的執行緒名:Thread-N,N是執行緒建立的順序,是一個不重複的正整數。
ThreadGroup group
當前建立的執行緒所屬的執行緒組。如果不指定執行緒組,所有的執行緒都被加到一個預設的執行緒組中。關於執行緒組的細節將在後面的章節詳細討論。
long stackSize
執行緒棧的大小,這個值一般是CPU頁面的整數倍。如x86的頁面大小是4KB。在x86平臺下,預設的執行緒棧大小是12KB。
一個普通的Java類只要從Thread類繼承,就可以成為一個執行緒類。並可通過Thread類的start方法來執行執行緒程式碼。雖然Thread類的子類可以直接例項化,但在子類中必須要覆蓋Thread類的run方法才能真正執行執行緒的程式碼。下面的程式碼給出了一個使用Thread類建立執行緒的例子:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> 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 }
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
上面的程式碼建立了兩個執行緒:thread1和thread2。上述程式碼中的005至008行是Thread1類的run方法。當在014和015行呼叫
start方法時,系統會自動呼叫run方法。在007行使用this.getName()輸出了當前執行緒的名字,由於在建立執行緒時並未指定執行緒名,因
此,所輸出的執行緒名是系統的預設值,也就是Thread-n的形式。在011行輸出了主執行緒的執行緒名。
上面程式碼的執行結果如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->main
Thread-0
Thread-1
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
注意:任何一個Java程式都必須有一個主執行緒。一般這個主執行緒的名子為main。只有在程式中建立另外的執行緒,才能算是真正的多執行緒程式。也就是說,多執行緒程式必須擁有一個以上的執行緒。
Thread類有一個過載構造方法可以設定執行緒名。除了使用構造方法在建立執行緒時設定執行緒名,還可以使用Thread類的setName方法修改執行緒名。要想通過Thread類的構造方法來設定執行緒名,必須在Thread的子類中使用Thread類的public
Thread(String name)構造方法,因此,必須在Thread的子類中也新增一個用於傳入執行緒名的構造方法。下面的程式碼給出了一個設定執行緒名的例子:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> 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
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
第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方法中建立了三個執行緒:thread1、thread2和thread3。其中thread1通過構造方法來設定執行緒名,thread2通過setName方法來修改執行緒名,thread3未設定執行緒名。
執行結果如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->thread1:MyThread1
thread2:MyThread2
thread3:Thread-1
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
注意:在呼叫start方法前後都可以使用setName設定執行緒名,但在呼叫start方法後使用setName修改執行緒名,會產生不確定性,也就是說可能在run方法執行完後才會執行setName。如果在run方法中要使用執行緒名,就會出現雖然呼叫了setName方法,但執行緒名卻未修改的現象。
Thread類的start方法不能多次呼叫,如不能呼叫兩次thread1.start()方法。否則會丟擲一個IllegalThreadStateException異常。來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-566663/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【原創】Java多執行緒初學者指南(3):使用Runnable介面建立執行緒Java執行緒
- 【原創】Java多執行緒初學者指南(1):執行緒簡介Java執行緒
- 【原創】Java多執行緒初學者指南(4):執行緒的生命週期Java執行緒
- 【原創】Java多執行緒初學者指南(5):join方法的使用Java執行緒
- 【原創】Java多執行緒初學者指南(12):使用Synchronized塊同步變數Java執行緒synchronized變數
- 【原創】Java多執行緒初學者指南(6):慎重使用volatile關鍵字Java執行緒
- Java多執行緒(二):Thread類Java執行緒thread
- java多執行緒之Thread類Java執行緒thread
- Java多執行緒Thread類使用Java執行緒thread
- Java多執行緒(2)執行緒鎖Java執行緒
- 【java】【多執行緒】建立執行緒的兩種常用方式(2)Java執行緒
- Java多執行緒——執行緒Java執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- java. 中 繼承Thread類建立執行緒.Java繼承thread執行緒
- Java多執行緒學習(2)執行緒控制Java執行緒
- java 多執行緒-2Java執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒——執行緒池Java執行緒
- Java多執行緒/併發07、Thread.Join()讓呼叫執行緒等待子執行緒Java執行緒thread
- 多執行緒系列(二)之Thread類執行緒thread
- Java多執行緒學習(1)建立執行緒與執行緒的生命週期Java執行緒
- 【 Thread】建立執行緒的2種方法thread執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- java多執行緒9:執行緒池Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- Java多執行緒——守護執行緒Java執行緒
- Java多執行緒16:執行緒組Java執行緒
- Java多執行緒18:執行緒池Java執行緒
- C#多執行緒之旅(2):建立和開始執行緒C#執行緒
- new Thread與執行緒建立thread執行緒
- 執行緒2--多執行緒NSThread執行緒thread
- Java多執行緒2:Thread中的例項方法Java執行緒thread
- Java多執行緒-執行緒池的使用Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒