使用Callable和Future介面建立執行緒

2021-09-07 15:21:12 字數 1258 閱讀 2628

具體是建立callable介面的實現類,並實現clall()方法。並使用futuretask類來包裝callable實現類的物件,且以此futuretask物件作為thread物件的target來建立執行緒。

看著好像有點複雜,直接來看乙個例子就清晰了。

public

class

threadtest

}system.

out.println("

主線程for迴圈執行完畢..");

try

catch

(interruptedexception e)

catch

(executionexception e)

}}class mycallable implements callable

return

sum;

}}

首先,我們發現,在實現callable介面中,此時不再是run()方法了,而是call()方法,此call()方法作為執行緒執行體,同時還具有返回值!在建立新的執行緒時,是通過futuretask來包裝mycallable物件,同時作為了thread物件的target。那麼看下futuretask類的定義:

public

class futuretaskimplements runnablefuture

public

inte***ce runnablefutureextends runnable, future

於是,我們發現futuretask類實際上是同時實現了runnable和future介面,由此才使得其具有future和runnable雙重特性。通過runnable特性,可以作為thread物件的target,而future特性,使得其可以取得新建立執行緒中的call()方法的返回值。

執行下此程式,我們發現sum = 4950永遠都是最後輸出的。而「主線程for迴圈執行完畢..」則很可能是在子執行緒迴圈中間輸出。由cpu的執行緒排程機制,我們知道,「主線程for迴圈執行完畢..」的輸出時機是沒有任何問題的,那麼為什麼sum =4950會永遠最後輸出呢?

原因在於通過ft.get()方法獲取子執行緒call()方法的返回值時,當子執行緒此方法還未執行完畢,ft.get()方法會一直阻塞,直到call()方法執行完畢才能取到返回值。

上述主要講解了三種常見的執行緒建立方式,對於執行緒的啟動而言,都是呼叫執行緒物件的start()方法,需要特別注意的是:不能對同一執行緒物件兩次呼叫start()方法。

Java執行緒 七 Callable和Future

public class callableandfuture futuretaskfuture new futuretask callable new thread future start try catch interruptedexception e catch executionexcept...

Java執行緒 六 Callable和Future

callable介面類似於runnable,從名字就可以看出來了,但是runnable不會返回結果,並且無法丟擲返回結果的異常,而callable功能更強大一些,被執行緒執行後,可以返回值,這個返回值可以被future拿到,也就是說,future可以拿到非同步執行任務的返回值,下面來看乙個簡單的例子...

Java執行緒 七 Callable和Future

public class callableandfuture futuretaskfuture new futuretask callable new thread future start try catch interruptedexception e catch executionexcept...