JAVA 併發程式設計-執行緒建立(二)
對於執行緒的建立及更加詳細的資訊可以參看部落格《執行緒》,下面是對執行緒建立的細化及簡單再實現。
在java中如果要建立執行緒的話,一般有兩種方式:1)繼承Thread類;2)實現Runnable介面。
方式一:繼承Thread類
MyThread:
package com.tgb.hjy; public class MyThread extends Thread{ private String name; public MyThread(String name){ this.name=name; } @Override public void run(){ System.out.println("name:"+name+",子執行緒ID:"+Thread.currentThread().getId()); } }
ClientThread:
package com.tgb.hjy;
public class ClientThread{
public static void main(String[] args){
System.out.println("主執行緒ID:"+Thread.currentThread().getId());
MyThread thread1=new MyThread("thread1");
thread1.start();
}
}
方式二:實現Runnable介面
MyRunnable:
package com.tgb.hjy; public class MyRunnable implements Runnable{ public MyRunnable(){ } @Override public void run() { System.out.println("主執行緒ID:"+Thread.currentThread().getId()); } }
ClientRunnable:
package com.tgb.hjy;
public class ClientRunnable {
public static void main(String[] args){
System.out.println("子執行緒ID:"+ Thread.currentThread().getId());
MyRunnable myRunnable=new MyRunnable();
Thread thread=new Thread(myRunnable);
thread.start();
}
}
注意,這種方式必須將Runnable作為Thread類的引數,然後通過Thread的start方法來建立一個新執行緒來執行該子任務。如果直接呼叫Runnable的run方法的話,是不會建立新執行緒的,這根普通的方法呼叫沒有任何區別。
事實上,檢視Thread類的實現原始碼會發現Thread類是實現了Runnable介面的。
上面我們一直在說,如果呼叫run方法,即相當於在主執行緒中執行run方法,跟普通的方法呼叫沒有任何區別,此時並不會建立一個新的執行緒來執行定義的任務。
下面我們來驗證一下:
public static void main(String[] args){
System.out.println("主執行緒ID:"+Thread.currentThread().getId());
MyThread thread1=new MyThread("thread1");
thread1.start();
MyThread thread2=new MyThread("thread2");
thread2.run();
}
呼叫thread2.start();方法輸出結果為:
從輸出結果可以得出以下結論:
1)thread1和thread2的執行緒ID不同,thread2和主執行緒ID相同,說明通過run方法呼叫並不會建立新的執行緒,而是在主執行緒中直接執行run方法,跟普通的方法呼叫沒有任何區別;
2)雖然thread1的start方法呼叫在thread2的run方法前面呼叫,但是先輸出的是thread2的run方法呼叫的相關資訊,說明新執行緒建立的過程不會阻塞主執行緒的後續執行。
總結:
在Java中,類僅支援單繼承,也就是說,當定義一個新的類的時候,它只能擴充套件一個外部類.這樣,如果建立自定義執行緒類的時候是通過擴充套件Thread類的方法來實現的,那麼這個自定義類就不能再去擴充套件其他的類,也就無法實現更加複雜的功能。因此,如果自定義類必須擴充套件其他的類,那麼就可以使用實現Runnable介面的方法來定義該類為執行緒類,這樣就可以避免Java單繼承所帶來的侷限性。
還有一點最重要的就是使用實現Runnable介面的方式建立的執行緒可以處理同一資源,從而實現資源的共享.--具體內容參看部落格《執行緒》