java中執行緒的兩種建立方式與比較
首先,回顧一下作業系統課程中程序相關部分:
程序的定義:程序就是程式在一個數據集合上的一次執行過程。他與程式的區別在於程式是靜態的程式碼,而程序是動態的執行過程。
程序的特性:1.結構性,程序由程式塊、資料塊、程序控制塊(PCB)組成;
2.動態性,程序是一次動態的執行過程,具有生命週期;
3.獨立性,程序是系統分配資源和保護的基本單位;
4. 併發性,一組程序在執行時間上可以重疊,在很短的時間內輪流執行,巨集觀上同時執行。(並行微觀上也是同 時執行)
早期的作業系統中,程序是分配資源和保護的基本單位也是處理器排程的基本單位,後來系統把“獨立資源分配”和“被排程分派執行”功能分開,獨立資源分配的基本單位仍是程序,“被排程分派執行”的基本單位成了執行緒。執行緒就是程序中能夠獨立執行的實體,是處理器排程和分派的基本單位。
下面討論java中建立執行緒的兩種方式和之間的區別:
1. Runna介面
宣告如下:
public interface Runnable
{
public abstract void run();
}
這個介面只有一個run()方法,也就是執行緒的執行方法,一個執行緒物件必須實現run()方法描述該執行緒所有的操作。
2.Thread類
Thread類就是執行緒類,他的部分方法宣告如下:
public class Thread extends Object implements Runnable { public Thread(); public Thread(String name); public Thread(Runnable target ); public Thread(String name,Runnable target); public void run(); public void start(); public String toString() }
從Thread類的構造方法可以看出,java建立執行緒的兩種方法是:繼承Thread類,實現Runnable介面。
第一種建立方法:
public class A extends Thread
{
public void run()
{
System.out.print(0);
}
public static void main(String []args)
{
A a=new A("執行緒1");
a.start(); }
}
執行後輸出0。
A類繼承了Thread類,建立物件a後,a呼叫Thread類的start()函式就開始執行run()方法。
第二種建立方法:
public class A implements Runnable
{
public void run()
{
System.out.print(1);
}
public static void main(String []args)
{
A a=new A();
Thread t=new Thread(a);
t.start();
}
}
執行後輸出1。
A類實現了Runnable介面,也就是實現了run()函式,將A類物件a作為目標物件,建立一個執行緒物件t,呼叫t.start(),將執行a的run()方法。
兩種方法的比較:
兩種方式建立執行緒物件的效果是一樣的,不同場合如何選取呢?
繼承Threa類,並且覆蓋Thread類的run()方法:這種方法的優點是Thread子類物件就是執行緒物件,具有Thread類的方法,且具有執行緒體,但是不適應多繼承。因為java裡類的繼承是單繼承的,繼承了Thread類就無法繼承其他類了。
實現Runnable介面:如果一個類已經繼承了一個類還必須要以執行緒方式執行,就需要實現Runnable介面。實現Runnable介面的類的物件本身並不是執行緒物件,只是作為一個建立執行緒物件的目標物件使用。