建立執行緒的四種方式

2021-10-19 05:31:51 字數 2719 閱讀 3583

public class greatthread 

static class threadtest extends thread

}}

public class greatthread 

});threadtest2.start();

}}

前兩種方法其實是類似的,方法一是通過重寫thread的run方法,方法二則是傳遞乙個重寫了run方法的物件給thread的建構函式。本質上都是對thread的run方法進行重寫,我們可以看一下thread的建構函式和run函式

//thread的建構函式,可以傳入runnable物件也可以不傳

public thread()

public thread(runnable target)

//thread類中的run方法

@override

public void run()

}

可以看出,執行緒本質上是執行內部的run方法。實現run方法有兩種途徑

一.重寫thread的run方法;

二.傳入乙個實現run方法的runnable物件,執行run方法時會去呼叫target.run();

所以方法一和方法二的本質都是實現thread內部的run方法。

前面兩種方式建立的執行緒都有乙個缺點,就是不能獲取執行緒執行的狀態或者結果。

方法三和方法四本質上是對前兩種方法的加強,通過這種方法建立執行緒可以獲取執行緒的執行狀態或者結果。且增加了一種處理異常的方式(看我寫的多執行緒異常處理文章)

首先了解一下callable這個介面

public inte***ce callable
和runnable介面類似,但是它的優點是可以有返回值。

我們在來看一下executorservice中的submit方法,向submit方法傳遞乙個callable物件,就會返回乙個對應的furture物件,這個furture物件可以獲取執行緒執行的部分資訊或者返回結果

futuresubmit(callabletask);

futuresubmit(runnable task, t result);

future<?> submit(runnable task);

我們來看一下furtrue這個介面,這個介面有五個方法,方法功能在下面有說明

public inte***ce future
cancel:取消當前任務,如果任務還未執行返回true,如果任務已經執行完成返回false。如果任務正在執行,傳入的mayinterruptifrunning引數是true返回true,是false則返回false。

iscancel:判斷任務是否取消

isdone:判斷任務是否完成

v get:獲取任務執行完成的返回值,如果任務還在執行則一直阻塞,直到任務執行完成獲得返回值

get(long timeout, timeunit unit)用來獲取執行結果,如果在指定時間內,還沒獲取到結果,就直接返回null。

通過這種方法建立執行緒可以獲得乙個furture物件來獲取執行緒執行的相關資訊

public class greatthread 

return sum;

}});

//獲得執行任務的結果

int result = future.get();

system.out.println(result);

}

我們先來看一下futuretask的實現:

public class futuretaskimplements runnablefuturepublic inte***ce runnablefutureextends runnable, future
可以看出runnablefuture繼承了runnable介面和future介面,而futuretask實現了runnablefuture介面。所以它既可以作為runnable被執行緒執行,又可以作為future得到callable的返回值。

public class greatthread2 

return sum;

}});

executorservice executor = executors.newcachedthreadpool();

executor.submit(futuretask);

executor.shutdown();

try catch (interruptedexception e) catch (executionexception e)

}}

其實這四種方法本質都是重寫run方法,submit相當於封裝了一層,最後都會去呼叫excute方法去執行futuretask裡面的run方法。

public futuresubmit(runnable task, t result) 

public futuresubmit(callabletask)

public future<?> submit(runnable task)

可以看出,submit方法相對於excute就是封裝了一層,將傳入的物件構造成futuretask物件,futuretask實現了runnable介面和future介面,即可以將其作為任務執行,也可以作為furture物件觀察控制任務的執行。

建立執行緒的四種方式

1.繼承於thread類,重寫run 方法 2.實現runable介面,實現裡面的run 方法 前兩種不用多說 3.使用 futuretask 實現有返回結果的執行緒,可以返回執行緒執行結果 public class test class mycallable implements callable...

建立執行緒的四種方式

class thread00 extends thread class thread01 implements runnable class thread02 implements callable 對以上三種方法進行測試 測試四種建立執行緒的方式 public class newthread 輸出...

建立執行緒的四種方式

首先我們先來了解一下測試thread中的常用方法 一 繼承thread類 二 實現runnable介面 三 實現callable介面 四 使用執行緒池建立 建立執行緒方式一 繼承thread類 繼承thread類建立執行緒的步驟為 1 新建乙個主類,然後再建立乙個類繼承thread的子類。2 重寫t...