1. 程式人生 > >JAVA 併發程式設計-執行緒建立(二)

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介面的方式建立的執行緒可以處理同一資源,從而實現資源的共享.--具體內容參看部落格《執行緒