首页 > 其他分享 >Future和Callable

Future和Callable

时间:2023-09-25 12:06:34浏览次数:30  
标签:RunnableFuture Runnable Callable 任务 Future FutureTask


Callable

Callable和Runnbale一样代表着任务,区别在于Callable有返回值并且可以抛出异常

Future

Future接口代表了线程池的异步计算结果。接口中的方法用来检查计算是否完成、等待完成和得到计算的结果。当计算完成后,只能通过get()方法得到结果,get方法会阻塞直到结果准备好了。如果想取消,那么调用cancel()方法。其他方法用于确定任务是正常完成还是取消了。一旦计算完成了,那么这个计算就不能被取消。

FutureTask类

FutureTask类实现了RunnableFuture接口,而RunnnableFuture接口继承了Runnable和Future接口,所以说FutureTask也是一个提供异步计算的结果的类。 FutureTask可以用来包装Callable或者Runnbale对象。因为FutureTask实现了Runnable接口,所以FutureTask也可以被提交给Executor。FutureTask既可以作为Runnable被执行,也可以作为Future得到Callable的返回值。

Future和Callable_Callable

Future作为异步计算的顶层接口,Future对具体的Runnable或者Callable任务提供了三种操作:执行任务的取消、查询任务是否完成、获取任务的执行结果。其接口定义如下:

public interface Future<V> {

    /**
     * 试图取消对此任务的执行
     * 如果任务已完成、或已取消,或者由于某些其他原因而无法取消,则此尝试将失败。
     * 当调用 cancel 时,如果调用成功,而此任务尚未启动,则此任务将永不运行。
     * 如果任务已经启动,则 mayInterruptIfRunning 参数确定是否应该以试图停止任务的方式来中断执行此任务的线程
     */
    boolean cancel(boolean mayInterruptIfRunning);

    /**
     * 如果在任务正常完成前将其取消,则返回 true
     */
    boolean isCancelled();

    /**
     * 如果任务已完成,则返回 true
     */
    boolean isDone();

    /**
     *   如有必要,等待计算完成,然后获取其结果
     */
    V get() throws InterruptedException, ExecutionException;

    /**
     * 如有必要,最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)
     */
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

RunnableFuture继承Future、Runnable两个接口,即所谓的Runnable的Future。提供了一个run()方法完成Future并允许访问其结果。

public interface RunnableFuture<V> extends Runnable, Future<V> {
    //在未被取消的情况下,将此 Future 设置为计算的结果
    void run();
}

AbstractExecutorService提供了newTaskFor()方法返回一个RunnableFuture,除此之外当我们把一个Runnable或者Callable提交给(调用submit())ThreadPoolExecutor或者ScheduledThreadPoolExecutor时,他们则会向我们返回一个FutureTask对象,如下:

protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
        return new FutureTask<T>(runnable, value);
    }
        protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
        return new FutureTask<T>(callable);
    }

    <T> Future<T> submit(Callable<T> task)
    <T> Future<T> submit(Runnable task, T result)
    Future<> submit(Runnable task)

ExecutorCompletionService

实现了CompletionService,将执行完成的任务放到阻塞队列中,通过take或poll方法来获得执行结果

/**
 * Created by xmr on 2018/8/28.
 * 启动10条线程,谁先执行完成就返回谁
 */
public class CompletionServiceTest {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //创建包含10条线程的线程池
        ExecutorService executor = Executors.newFixedThreadPool(10);
        CompletionService completionService = new ExecutorCompletionService(executor);
        for (int i =1; i <=10; i ++) {
            final  int result = i;
            completionService.submit(new Callable() {
                public Object call() throws Exception {
                    Thread.sleep(new Random().nextInt(5000));   //让当前线程随机休眠一段时间
                    return result;
                }
            });
        }
        System.out.println(completionService.take().get());   //获取执行结果
    }
}

 

参考:

http://cmsblogs.com/?p=2444


标签:RunnableFuture,Runnable,Callable,任务,Future,FutureTask
From: https://blog.51cto.com/u_6947107/7594180

相关文章

  • 并发编程系列-CompletableFuture
    利用多线程来提升性能,实质上是将顺序执行的操作转化为并行执行。仔细观察后,你还会发现在顺序转并行的过程中,一定会牵扯到异步化。举个例子,现在下面这段示例代码是按顺序执行的,为了优化性能,我们需要将其改为并行执行。那具体的实施方法是什么呢?//以下两个方法都是耗时操作doBizA();......
  • 从 5s 到 0.5s!CompletableFuture 异步任务优化技巧,确实优雅!
    一个接口可能需要调用N个其他服务的接口,这在项目开发中还是挺常见的。举个例子:用户请求获取订单信息,可能需要调用用户信息、商品详情、物流信息、商品推荐等接口,最后再汇总数据统一返回。如果是串行(按顺序依次执行每个任务)执行的话,接口的响应速度会非常慢。考虑到这些接口之间......
  • CompletableFuture 异步多线程D优雅!
    一个示例回顾Future一些业务场景我们需要使用多线程异步执行任务,加快任务执行速度。JDK5新增了Future接口,用于描述一个异步计算的结果。虽然Future以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,我们必须使用Future.get()的方式阻塞调用线程,或者使用轮......
  • 解决代码使用CompletableFuture做异步时spring-cloud-starter-sleuth的日志追踪号为空
    产生问题原因就是异步调用,导致spanId和traceId丢失了@Async注解的异步调用是没问题的前提使用spring-cloud-starter-sleuthjar包版本2.2.8.RELEASE关于追踪号的xml配置为<pattern>%yellow(%date{yyyy-MM-ddHH:mm:ss.SSS})[%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-B......
  • ananas future分析
    在《异步编程:promiseandfuture》一文中对promise&future异步编程进行了介绍,文中对“回调地狱”也进行简单说明,本文对其中一种开源方案源码进行分析;uml类图Promise和Future对象共享一个State状态,其数据结构为:enumclassProgress{None,Timeout,Done,Retrie......
  • future
    或许有的事情现在考虑还为时过早,但是不得不考虑,那就是如何生存未来到底需要找到什么样的工作才能平衡呢?我不明白,但是我其实没有那种守财的顾虑,可是平衡这件事情听起来似乎是很困难的。不知道呢先走好现在的路吧,这是必须得做的。......
  • CompletableFuture总结和实践
    CompletableFuture被设计在Java中进行异步编程。异步编程意味着在主线程之外创建一个独立的线程,与主线程分隔开,并在上面运行一个非阻塞的任务,然后通知主线程进展,成功或者失败。一、概述1.CompletableFuture和Future的区别?CompletableFuture和Future出现的原因是继承Thread或者实现R......
  • CompletableFuture 使用
    importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;importjava.util.concurrent.CompletableFuture;importjava.util.concurrent.ExecutionException;/***@Author:TrueNewBee*@Date:2023/8/2823:05*@Github:https://github.com......
  • 类型注解Callable
    fromcollections.abcimportCallable"""Callable[[ParamType1,ParamType2],ReturnType][参数1类型,参数2类型],返回值类型Callable[[],int]是Callable[[],float]的子类型,因为int是float的子类型。这意味着,那个Callable的返回值类型经历了协变(covariant),因为......
  • 20230629 java.sql.CallableStatement
    介绍java.sql.CallableStatementpublicinterfaceCallableStatementextendsPreparedStatementAPIpublicregisterOutParameterwasNullset/getgetArraygetRefsetAsciiStreamsetBigDecimal,getBigDecimalsetBinaryStreamsetBlob,getBlobsetBoolean,getBoo......