Callable與Future介紹
Callable介紹:
Callable是類似于Runnable的接口,實(shí)現(xiàn)Callable接口的類和實(shí)現(xiàn)Runnable的類都是可被其他線程執(zhí)行的任務(wù),
Callable的接口定義如下:
//可以看到,這是一個泛型接口糙箍,call()函數(shù)返回的類型就是傳遞進(jìn)來的V類型。
public interface Callable<V>{
V call() throws Exception;
}
callable的使用需要配置Future的實(shí)現(xiàn)類來使用,我們知道new Thread().start來執(zhí)行一個線程,但是Thread的入?yún)⒗锩媸菦]有提供Callable的入?yún)?shù)的,所以就是不能直接運(yùn)行!!!那我們怎么執(zhí)行一個實(shí)行Callable的實(shí)現(xiàn)類呢,別急~到下面講解Future來執(zhí)行Callable的過程
Callable和Runnable的區(qū)別
- Callable定義的方法是call,而Runnable定義的方法是run
- Callable的call方法可以有返回值,而Runnable的run方法不能有返回值
- Callable的call方法可以拋出異常,而Runnable的run方法不能拋出異常
Future介紹
Future表示異步計(jì)算的結(jié)果骤素,它提供了檢查計(jì)算是否完成的方法,以等待計(jì)算的完成译秦,并檢索計(jì)算的結(jié)果近尚。Future的cancel方法可以取消任務(wù)的執(zhí)行爵憎,它有一布爾參數(shù),參數(shù)為 true 表示立即中斷任務(wù)的執(zhí)行鸳劳,參數(shù)為 false 表示允許正在運(yùn)行的任務(wù)運(yùn)行完成狰贯。Future的 get 方法等待計(jì)算完成,獲取計(jì)算結(jié)果
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
由此可見提供了5個方法給我們操作
- cancel 可以中斷任務(wù)執(zhí)行
- isCancelled方法表示任務(wù)是否被取消成功赏廓,如果在任務(wù)正常完成前被取消成功涵紊,則返回 true。
- isDone方法表示任務(wù)是否已經(jīng)完成幔摸,若任務(wù)完成摸柄,則返回true
- get()方法用來獲取執(zhí)行結(jié)果,這個方法會產(chǎn)生阻塞既忆,會一直等到任務(wù)執(zhí)行完畢才返回驱负;
- get(long timeout, TimeUnit unit)用來獲取執(zhí)行結(jié)果,如果在指定時(shí)間內(nèi)患雇,還沒獲取到結(jié)果跃脊,就直接返回null。
一下列子實(shí)現(xiàn)Callable接口,然后我們使用Future的實(shí)現(xiàn)類FutureTask來獲取下一Callable實(shí)現(xiàn)類并獲取call方法中的返回值
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class FutureTaskTest implements Callable<Boolean> {
//重寫
@Override
public Boolean call() throws Exception {
System.out.println("線程處理中");
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
//通過FutureTask來執(zhí)行以上定義的Callable,提供了Callable的入?yún)? FutureTask<Boolean> task = new FutureTask<>(new FutureTaskTest());
//因?yàn)镕utureTask實(shí)現(xiàn)了Runnable和接口,而new Thread提供了Runnable的入?yún)?所以能執(zhí)行到call的方法
new Thread(task).start();
if (task.get()) {
System.out.println("線程處理完成");
}
}
}
// 執(zhí)行結(jié)果
線程處理中
線程處理完成