java终结方法_Java终结任务:Callable和Future
在這里首先介紹下Callable和Future,我們知道通常創(chuàng)建線程的2種方式,一種是直接繼承Thread,另外一種就是實(shí)現(xiàn)Runnable接口,但是這兩種方式創(chuàng)建的線程不返回結(jié)果,而Callable是和Runnable類似的接口定義,但是通過(guò)實(shí)現(xiàn)Callable接口創(chuàng)建的線程可以有返回值,返回值類型可以任意定義。
Callable接口
public interface Callable {
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
V call() throws Exception;
}
可以看到,這是一個(gè)泛型接口,call()函數(shù)返回的類型就是傳遞進(jìn)來(lái)的V類型。
那么怎么使用Callable呢?一般情況下是配合ExecutorService來(lái)使用的,在ExecutorService接口中聲明了若干個(gè)submit方法的重載版本:
Future submit(Callable task);
Future submit(Runnable task, T result);
Future> submit(Runnable task);
第一個(gè)submit方法里面的參數(shù)類型就是Callable。Callable一般是和ExecutorService配合來(lái)使用的,通過(guò)ExecutorService的實(shí)例submit得到Future對(duì)象。
Future
Future接口如下:
public interface Future {
boolean cancel(boolean mayInterruptIfRunning);// 試圖取消對(duì)此任務(wù)的執(zhí)行
boolean isCancelled(); // 如果在任務(wù)正常完成前將其取消,則返回true
boolean isDone(); // 如果任務(wù)已完成(不管是正常還是異常),則返回true
V get() throws InterruptedException, ExecutionException; // 方法用來(lái)獲取執(zhí)行結(jié)果,這個(gè)方法會(huì)產(chǎn)生阻塞,會(huì)一直等到任務(wù)執(zhí)行完畢才返回;
// 用來(lái)獲取執(zhí)行結(jié)果,如果在指定時(shí)間內(nèi),還沒(méi)獲取到結(jié)果,就直接返回null;
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
}
Future用于表示異步計(jì)算的結(jié)果。它的實(shí)現(xiàn)類是FutureTask。
如果不想分支線程阻塞主線程,又想取得分支線程的執(zhí)行結(jié)果,就用FutureTask
FutureTask實(shí)現(xiàn)了RunnableFuture接口,這個(gè)接口的定義如下:
public interface RunnableFuture extends Runnable, Future
{
void run();
}
可以看出RunnableFuture繼承了Runnable接口和Future接口,而FutureTask實(shí)現(xiàn)了RunnableFuture接口。所以它既可以作為Runnable被線程執(zhí)行,又可以作為Future得到Callable的返回值。
使用示例
package demo.future;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
/**
* 試驗(yàn) Java 的 Future 用法
*/
public class FutureTest {
public static class Task implements Callable {
@Override
public String call() throws Exception {
String tid = String.valueOf(Thread.currentThread().getId());
System.out.printf("Thread#%s : in call\n", tid);
return tid;
}
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
List> results = new ArrayList>();
ExecutorService es = Executors.newCachedThreadPool();
for(int i=0; i<100;i++)
results.add(es.submit(new Task()));
for(Future res : results)
System.out.println(res.get());
}
}
終結(jié)任務(wù)
持有Future對(duì)象,可以調(diào)用cancel(),并因此可以使用它來(lái)中斷某個(gè)特定任務(wù),如果將ture傳遞給cancel(),那么它就會(huì)擁有該線程上調(diào)用interrupt()以停止這個(gè)線程的權(quán)限。因此,cancel()是一種中斷由Executor啟動(dòng)的單個(gè)線程的方式。
cancel()一般是搭配get()方法來(lái)使用的。比方說(shuō),有一種設(shè)計(jì)模式是設(shè)定特定的時(shí)間,然后去執(zhí)行一個(gè)作業(yè)的線程,如果該作業(yè)能夠在設(shè)定的時(shí)間內(nèi)執(zhí)行完畢,則直接返回結(jié)果,如果不能執(zhí)行完畢,則中斷作業(yè)的執(zhí)行,繼續(xù)執(zhí)行下一個(gè)作業(yè),在這種模式下,使用Callable和Future來(lái)實(shí)現(xiàn)是一個(gè)非常好的解決方案。
總結(jié)
以上是生活随笔為你收集整理的java终结方法_Java终结任务:Callable和Future的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 机器学习入门(1)之基本概念简介
- 下一篇: java 静态方法同步_Java – 同