1. 程式人生 > >線程的幾種創建方式

線程的幾種創建方式

head class 線程池 runnable 計算 異步 影響 bsp nts

編寫多線程程序是為了實現多任務的並發執行,從而能夠更好地與用戶交互。一般有三種方法,Thread,Runnable,Callable.

Runnable和Callable的區別是,
(1)Callable規定的方法是call(),Runnable規定的方法是run().
(2)Callable的任務執行後可返回值,而Runnable的任務是不能返回值得
(3)call方法可以拋出異常,run方法不可以
(4)運行Callable任務可以拿到一個Future對象,表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果。通過Future對象可以了解任務執行情況,可取消任務的執行,還可獲取執行結果。

1、通過實現Runnable接口來創建Thread線程:

步驟1:創建實現Runnable接口的類:


class SomeRunnable implements Runnable
{
public void run()
{
//do something here
}
}

步驟2:創建一個類對象:

Runnable oneRunnable = new SomeRunnable();

步驟3:由Runnable創建一個Thread對象:

Thread oneThread = new Thread(oneRunnable);

步驟4:啟動線程:

oneThread.start();

至此,一個線程就創建完成了。

註釋:線程的執行流程很簡單,當執行代碼oneThread.start();時,就會執行oneRunnable對象中的void run();方法,

該方法執行完成後,線程就消亡了。

2、與方法1類似,通過實現Callable接口來創建Thread線程:其中,Callable接口(也只有一個方法)定義如下:

public interface Callable<V>
{
V call() throws Exception;
}
步驟1:創建實現Callable接口的類SomeCallable<Integer>(略);

步驟2:創建一個類對象:

Callable<Integer> oneCallable = new SomeCallable<Integer>();

步驟3:由Callable<Integer>創建一個FutureTask<Integer>對象:

FutureTask<Integer> oneTask = new FutureTask<Integer>(oneCallable);

註釋:FutureTask<Integer>是一個包裝器,它通過接受Callable<Integer>來創建,它同時實現了Future和Runnable接口。
步驟4:由FutureTask<Integer>創建一個Thread對象:

Thread oneThread = new Thread(oneTask);

步驟5:啟動線程:

oneThread.start();

至此,一個線程就創建完成了。

3、通過繼承Thread類來創建一個線程:

步驟1:定義一個繼承Thread類的子類:



class SomeThead extends Thraad
{
public void run()
{
//do something here
}
}

步驟2:構造子類的一個對象:

SomeThread oneThread = new SomeThread();

步驟3:啟動線程:

oneThread.start();

至此,一個線程就創建完成了。

註釋:這種創建線程的方法不夠好,主要是因為其涉及運行機制問題,影響程序性能。

4、通過線程池來創建線程:

步驟1:創建線程池:

ExecutorService pool = Executors.newCachedThreadPool();

步驟2:通過Runnable對象或Callable對象將任務提交給ExecutorService對象:

Future<Integer> submit(Callable<Integer> task);

註釋:Future是一個接口,它的定義如下:


public interface Future<T>
{
V get() throws ...;
V get(long timeout, TimeUnit unit) throws ...;
void cancle(boolean mayInterrupt);
boolean isCancelled();
boolean isDone();
}

至此,一個線程就創建完成了。

註釋:線程池需調用shutdown();方法來關閉線程。

線程的幾種創建方式