1. 程式人生 > >java執行緒的3種建立方式

java執行緒的3種建立方式

Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項。Java可以用三種方式來建立執行緒,如下所示:

1)繼承Thread類建立執行緒

2)實現Runnable介面建立執行緒

3)實現Callable介面建立執行緒

4)通過執行緒池的方式建立(這裡不通過程式碼演示)在後期的持久化會提到

------------------------繼承Thread類建立執行緒---------------------

 

通過繼承Thread類來建立並啟動多執行緒的一般步驟如下

1】定義Thread類的子類,並重寫該類的run()

方法,該方法的方法體就是執行緒需要完成的任務,run()方法也稱為執行緒執行體。

2】建立Thread子類的例項,也就是建立了執行緒物件

3】啟動執行緒,即呼叫執行緒的start()方法

程式碼例項

// 繼承Thread類,重寫run方法
class ThreadA extends Thread {
	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(this.getName() + "ThreadA:" + i);
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				e.getStackTrace();
			}
		}
	}
}

------------------------實現Runnable介面建立執行緒---------------------

通過實現Runnable介面建立並啟動執行緒一般步驟如下:

1】定義Runnable介面的實現類,一樣要重寫run()方法,這個run()方法和Thread中的run()方法一樣是執行緒的執行體

2】建立Runnable實現類的例項,並用這個例項作為Thread的target來建立Thread物件,這個Thread物件才是真正的執行緒物件

3】第三部依然是通過呼叫執行緒物件的start()方法來啟動執行緒

程式碼例項

// 實現runnable介面,重寫run方法

class ThreadB implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread() + "ThreadB:" + i);
		}

	}

}

------------------------使用Callable和Future建立執行緒---------------------

 

1】建立Callable介面的實現類,並實現call()方法,然後建立該實現類的例項(從java8開始可以直接使用Lambda表示式建立Callable物件)。

2】使用FutureTask類來包裝Callable物件,該FutureTask物件封裝了Callable物件的call()方法的返回值

3】使用FutureTask物件作為Thread物件的target建立並啟動執行緒(因為FutureTask實現了Runnable介面)

4】呼叫FutureTask物件的get()方法來獲得子執行緒執行結束後的返回值

程式碼例項:

// 實現callable介面,重寫call方法(該方法具有返回值)

class ThreadC implements Callable<String> {

    @Override
    public String call() throws Exception {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread() + "ThreadC:" + i);
        }
        return "haha";
    }

}

最終的測試

public class ThreadCreate {

	public static void main(String[] args) {
		 new ThreadA().start();
		 new ThreadA().start();
		
		 new Thread(new ThreadB()).start();
		 new Thread(new ThreadB()).start();

		FutureTask<String> ft0 = new FutureTask<String>(new ThreadC());
		FutureTask<String> ft1 = new FutureTask<String>(new ThreadC());
		new Thread(ft0).start();
		new Thread(ft1).start();
		try {
			System.out.println(ft0.get());
		} catch (InterruptedException e) {
			
			e.printStackTrace();
		} catch (ExecutionException e) {
			
			e.printStackTrace();
		} finally {
			System.out.println("finally在haha之後執行");
		}

	}

}