Java并发编程:Callable、Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程
可使用FutureTask包装Callable或Runnable对象,因为FutureTask实现了Runnable和Future(看源码可以看出来),所以也可以将FutureTask提交给Executor。一般使用FutureTask代替Future即可 使用方法 Callable、Future、FutureTask一般都是和线程池配合使用的,因为线程池ThreadPoolExecutor的父类AbstractExecutorService提供了三种submit方法: 1、pu...
public FutureTask(Callablecallable) { } public FutureTask(Runnable runnable, V result) { } 事实上,FutureTask是Future接口的一个唯一实现类。 4 Future和FutureTask的使用 4.1 使用Callable+Future获取执行结果 public class CallableFutureTest { public static void main(String[] args) { //创建线程池 ExecutorS...
FutureTask<Integer> futureTask = new FutureTask<>(new CallableDemo()); //因为futureTask实现了Runnable接口,像普通的Runnable实现类一样传入Thread就可以了 Thread t1 = new Thread(futureTask, "t1"); //让两个相同的线程同时执行futureTask Thread t2 = new Thread(futureTask, "t2"); //正常启动 t1.start...
CallablemyComputation=…FutureTask<Integer>task=newFutureTask<Integer>(myComputation);Threadthread=newThread(task);thread.start(); 当以上线程启动后,会执行Callable实例中的call()方法,并且运算结果保存在FutureTask实例中。 以下例程1的Machine类演示了两个线程之间进行异步运算的过程。
2.2 FutureTask 执行 当我们在线程池中执行一个 Callable 方法时,其实是将 Callable 任务封装成一个 ...
FutureTask包装器是一种非常便利的机制,可将Callable转换成Future和Runnable,它同时实现二者的接口。例如: Callable<Integer> callable=...; FutureTask<Integer> task=new FutureTask<Integer>(callable); Thread t=new Thread(task);//it's a Runnable
Callable;import java.util.concurrent.FutureTask;import java.util.concurrent.TimeUnit;/** * @类说明: SearchTask 调用搜索接口数据,同时需要t1推荐接口数据 * 张俊杰 2020年10月21日 20:54 */public class SearchTask implements Callable<String> { FutureTask<String> ft1; // SearchTask 任务需要 Recommend...
1 Callable 2 Future 3 FutureTask 1 Callbale说明 @FunctionalInterfacepublic interface Callable<V> { V call() throws Exception; } 该接口声明了泛型,call()函数返回的类型就是调用者传递进来的V类型. 注意: 1 Callable规定的方法是call(),而Runnable规定的方法是run(). ...
FutureTask是Future的一个具体实现,它同样实现了Runnable,因此它既可以由Thread对象执行,也可以提交给ExecutorService。 importjava.util.concurrent.FutureTask;publicclassFutureTaskExample{publicstaticvoidmain(Stringargs){Callable<String>callable=newWordCallable();FutureTask<String>task=newFutureTask<>(callable);newThread...