首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

调用返回类型为future的方法不能并行工作,为什么?

调用返回类型为Future的方法不能并行工作的原因是因为Future对象代表了一个异步计算的结果,并且提供了获取结果的方法。当调用一个返回类型为Future的方法时,该方法会在后台进行计算,并返回一个未来的结果对象。在这个过程中,调用线程不会被阻塞,可以继续执行其他操作。

然而,由于Future对象表示一个尚未完成的计算任务,因此在获取结果之前,调用线程需要等待该计算任务的完成。如果在等待期间同时调用多个返回类型为Future的方法,那么每个方法都会启动一个新的计算任务,但是由于等待任务完成的时间不确定,这些方法并不能并行工作。

为了实现并行工作,可以使用Java中的CompletableFuture类。CompletableFuture类是Future的扩展,它提供了更加丰富的操作和组合异步计算的方法。通过使用CompletableFuture,可以将多个异步任务组合起来,并在任务完成后执行特定的操作,从而实现并行工作。

对于调用返回类型为Future的方法而言,可以采用以下步骤实现并行工作:

  1. 创建多个CompletableFuture对象,每个对象代表一个异步计算任务。
  2. 使用CompletableFuture的静态方法allOf()将这些对象组合为一个新的CompletableFuture,该对象代表所有计算任务的联合结果。
  3. 调用这个新的CompletableFuture对象的join()方法等待所有计算任务完成,并获取结果。

这样,调用返回类型为Future的方法就能够并行工作,提高系统的并发性能和响应速度。

推荐的腾讯云相关产品:无

参考链接:无

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【手记】走近科学之为什么明明实现了IEnumerable类型不能调用LINQ扩展方法

比如Json.NETJObject明明实现了IEnumerable,具体来说是IEnumerable>,按说JObject类型对象是可以直接调用...Select、Where等linq扩展方法,但偏偏就是不行,代码如下: using System.Linq; ... var jobj = new JObject(); var xxx = jobj.Select...(x=>x); //报错:JObject未包含Select定义,也不存在第1个参数JObjectSelect扩展方法... foreach(var x in jobj) { } //可以 var xxx...= ((IEnumerable>)jobj).Select(x=>x); //也可以 究竟是人性扭曲还是道德沦丧?...,等于JObject直接和间接实现了两个不同IEnumerable,当.Select时候编译器不能确定调用哪个类型Select,所以就这样了。

79810
  • 在Java中为什么不同返回类型不算方法重载?

    方法签名组成规则我们可以看出,方法返回类型不是方法签名组成部分,所以当同一个类中出现了多个方法名和参数相同,但返回类型不同方法时,JVM 就没办法通过方法签名来判断到底要调用哪个方法了,如下图所示...: 那为什么返回类型不能做为方法签名一部分呢?...原因其实很简单,试想一下,如果方法返回类型也作为方法签名一部分,那么当程序员写了一个代码去调用“重载”方法时,JVM 就不能分辨要调用哪个方法了,如下代码所示: public class OverloadExample...,所以方法返回类型不能作为方法签名一部分。...方法返回类型不能作为方法重载依据,因为它不是方法签名组成部分。

    3.4K10

    Java并发编程(6)- J.U.C组件拓展

    一旦计算完成,计算就不能重新启动或取消(除非使用runAndReset方法调用计算)。...由于run()方法返回void类型,所以在执行完任务之后无法返回任何结果: public interface Runnable { public abstract void run(); }...说白了Future就是对于具体Runnable或者Callable任务执行结果进行取消、查询是否完成以及获取执行结果。其中执行结果通过get方法获取,该方法会阻塞直到任务返回结果。...那么为什么需要使用工作窃取算法呢?...其内部并没有数据缓存空间,你不能调用peek()方法来看队列中是否有数据元素,当然遍历这个队列操作也是不允许: public class SynchronousQueue extends AbstractQueue

    30330

    Executor并发框架

    Executor 框架工作是调度和执行已提交任务并从线程池中拿到返回结果。...浮现于脑海中一个基本问题是,当我们创建 java.lang.Thread 对象或调用实现了 Runnable/Callable 接口来达到程序并行性时,为什么需要线程池?...如果任务完成,结果将立即返回调用者,否则调用者将被阻塞,直到 executor 完成此操作执行并计算出结果。 如果调用不能无限期地等待任务执行结果,那么这个等待时间也可以设置定时地。...对于 Future.get()方法返回结果,一个重要事情是,只有提交任务实现了java.util.concurrent.Callable接口时才返回 Future。...; } } Task 类实现 Callable 接口并有一个 String 类型作为返回方法。 这个方法也可以抛出 Exception。

    31030

    JDK13快来了,JDK8这几点应该再看看!

    通过Collection接口默认方法获取并行流。 ? 或者通过stream流调用parallel获取并行流 ? 只需要对并行调用sequential方法就可以把它变成顺序流 中间操作 ? ?...这样一来,你就可以自动把给定操作工作负荷分配给多核处理器所有内核,让它们都忙起来。 ? ? 并行流用线程是从哪儿来?有多少个?怎么自定义这个过程呢?...里面有非常多方法返回CompletableFuture之后可以用链式编程.形式继续调用,最后调用一个不是返回CompletableFuture介绍,和流式操作里面的中间操作-终止操作。...2、 创建对象:不允许空 Optional提供了方法of()用于创建非空对象,该方法要求传入参数不能为空,否则抛NullPointException,示例如下: Optional optStr...= Optional.of(str); // 当strnull时候,将抛出NullPointException 3、创建对象:允许空 如果不能确定传入参数是否存在null值可能性,则可以用

    68441

    服务框架多形式服务调用:同步、异步、并用、泛化

    以Netty Future接口定义例,新增了监听器管理接口,监听器主要用于异步通知回调,它接口定义如图 。 异步服务调用工作原理如图 。...异步服务调用工作流程如下: 1)消费者调用服务端发布接口,接口调用由分布式服务框架包装成动态代理,发起远程服务调用。 2)通信框架异步发送请求消息,如果没有发生 I/O异常,返回。...用户不能直接使用它返回值,而是通过当前线程上下文RPCContext获取异步操作结果 Future。...获取到 Future之后继续发起其他异步服务调用,然后获取另一个 Future……昀后,通过 Future get方法集中获取结果。...7)消费者调用 Parallel Future get(timeout)方法, 同步阻塞,等待所有结果全部返回

    1.6K10

    python数据结构和GIL及多进程

    ---- 为什么说容器大小不准确,其原因是如果不加锁,是不可能获取到准确大小,因为你刚读取了一个大小,还没取走,有可能被就被其他线程修改了,queue类size虽然加了锁,但是依然不能保证立即...(wait=True) 清理池 Future方法 含义 result() 可以查看调用返回结果 done() 如果调用被成功取消或者执行完成,则返回True cancelled()...如果调用被成功取消,返回True running() 如果正在运行且不能被取消,则返回True cancel() 尝试取消调用,如果已经执行且不能取消则返回False,否则返回True result(...f.done() # 若都调用成功,则返回True,否则则返回False if flag: executor.shutdown() # 如果全部调用成功,则需要清理池...,此处返回True flag=flag and f.done() # 若都调用成功,则返回True,否则则返回False if flag: executor.shutdown

    45120

    FlutterDart中异步编程之Isolate

    我们都知道 Dart 是单线程异步编程模型 这一点 和js 很像,它天生解决了异步执行问题,详情查看Flutter中异步编程Future。 但是并行执行怎么处理呢?...所以说Isolate,一句话总结它作用就是 Isolate可以实现异步并行多个任务 Future实现异步串行多个任务 使用场景 在 Dart 中 async 和 Future 无法解决所有耗时工作...isolate 还是会 freeze(冻结) 住 (为什么会冻结?...,第一个是待执行函数,这个函数必须是一个顶级函数或静态方法不能是类实例方法,第二个参数动态消息类型,可以是被运行函数参数。...run 方法将会返回我们执行方法返回值。 整体和 compute 使用感觉上差不多,但是当我们多次使用额外 isolate 时候,不再需要重复创建了。

    3.2K41

    Java 并发工具包-常用线程池

    Callable 实例除了它 call() 方法能够返回一个结果之外和一个 Runnable 很相像。Runnable.run() 不能返回一个结果。...Callable 结果可以通过 submit(Callable) 方法返回 Future 对象进行获取。...调用这个方法并不会返回一个 Future,但它返回其中一个 Callable 对象结果。无法保证返回是哪个 Callable 结果 - 只能表明其中一个已执行结束。...你可以提交两种类型任务。一种是没有任何返回(一个 "行动"),另一种是有返回(一个"任务")。这两种类型分别由 RecursiveAction 和 RecursiveTask 表示。...MyRecursiveTask 示例也会将工作分割子任务,并通过 fork() 方法对这些子任务计划执行。 此外,本示例还通过调用每个子任务 join() 方法收集它们返回结果。

    1.1K40

    Java并发 - Java core I

    需要把输入转换为一个基本类型值,并指定一个默认值和一个累加器函数。 映射空时返回默认值。...Callable接口是一个参数化类型,只有一个方法call public interface Callable{ V call() throws Exception(); } 类型参数时返回类型...调用submit时,会得到一个Future对象,可以用来查询该任务状态。 第一个submit方法返回一个奇怪样子Future。...它会返回一个future。第一个future完成时,其结果会提供给getLinks,这个方法返回值就是最终结果。 利用可完成Future,可以指定你希望做什么,以及希望以什么顺序执行这些工作。...任意给定future完成后则完成,结果void 前3个方法并行运行一个CompletableFuture和一个CompletableFuture动作,并组合结果。

    51340

    『互联网架构』软件架构-Dubbo调用模块(46)

    (一)Dubbo调用模块概述 dubbo调用模块核心功能是发起一个远程方法调用并顺利拿到返回结果,其体系组成如下: 透明代理:通过动态代理技术,屏蔽远程调用细节以提高编程友好性。...并行调用: 只要一个成功即返回并行调用指定数量机器,可通过 forks="2" 来设置最大并行数。 广播调用:广播调用所有提供者,逐个调用,任意一台报错则报错。...="..." cluster="broadcast"/ > 异步调用 异步调用是指发起远程调用之后获取结果方式 同步等待结果返回 异步等待结果返回 不需要返回结果 ?...Filter 功能用于拦截远程方法调用。...PS:dubbo毕竟是国人写,很符合国人口味,虽然dubbo有年头了,但是始终没有996icustar多,这是为什么呢?实践的人少了,吹牛的人多啊。

    72620

    JDK15就要来了,你却还不知道JDK8新特性!

    (这也很正常,接口本来就不能实例化) 需要注意是,不能通过实现类对象去调用接口静态方法。...这里,直接调用map方法,就不需要对user对象进行预先判空了。因为在map方法里边,会调用isPresent方法帮我们处理usernull情况。...default Stream stream() //返回一个顺序流 default Stream parallelStream() //返回一个并行流 此处,我们也就明白了,为什么 JDK8...(但是,在并行计算中,和两个参数 reduce 初始值含义不一样,一会儿说)x需要注意,初始值和规约函数返回类型一致都是 U。...其类型是 BinaryOperator ,前面说过这个函数式接口,它是传入两个相同类型参数,返回类型也相同,都是 U 。需要注意是,这个参数只有在 reduce 并行计算中才会生效。

    88960

    Java8 - 避免代码阻塞骚操作

    要不试试CompletableFuture ,将 findPrices 方法中对不同商店同步调用替换为异步调用。...但是,由于你用CompletableFutures 实现 findPrices 方法要求返回一个 List ,你需要等待所有的 future 执行完毕,将其包含值抽取出来,填充到列表中才能返回 为了实现这个效果...Note: CompletableFuture 类中 join 方法Future 接口中 get 有相同含义,并且也声明在Future 接口中,它们唯一不同是 join 不会抛出任何检测到异常...尤其是,考虑到从顺序执行版本转换到并行版本只做了非常小改动,就让人更加沮丧 与此形成鲜明对比是,我们采用 CompletableFutures 完成新版方法做了大量工作!...---- 更好方案 并行版本工作得非常好,那是因为它能并行地执行四个任务,所以它几乎能为每个商家分配一个线程。但是,如果你想要增加第五个商家到商点列表中,让你“最佳价格查询”应用

    52450

    《实战Java高并发程序设计》读书笔记

    2、减小锁粒度 ConcurrentHashMap(只有获取全局信息方法调用不频繁时,这种方法才能真正意义上提高系统吞吐量) 3、读写分离锁替代独占锁——–ReadWriteLock 4、锁分离思想...单例模式 2、不变模式 3、生产者-消费者模式 4、Future模式 Future模式是多线程开发中非常常见一种设计模式,它核心思想是异步调用。...---- 接口Callable与Runnable区别 1)Callable接口call()方法可以有返回值,而Runnable接口run()方法没有返回值。...---- 方法excute()与submit()区别 1) 方法excute()没有返回值,而submit()方法可以有返回值。...2)方法excute()在默认情况下异常直接抛出,不能捕获,但可以通过自定义Thread-Factory方式进行捕获,而submit()方法在默认情况下,可以有catch Execution-Exception

    33910

    泛函编程(18)-泛函库设计-并行运算组件库

    作为专业编程人员,我们经常会因为工作需要建立一些工具库。所谓工具库就是针对工作上经常会遇到一些共性问题预先编制由一整套函数所组成函数库。...泛函组件库设计一般针对特别的功能需求或课题:首先尝试用一些数据类型来表述课题需求,然后围绕这些特制数据类型设计一系列函数针对课题各个最基本需求范畴提供解决方法。...先从数据类型着手:一个并行运算应该像是一个容器,把一个普通运算封装在里面。我们来随便造个结构出来:Par[A],A是普通运算返回结果类型。...假设我们选择用由程序员调用一个函数来确定产生新线程。...把A升格到一个并行运算描述 2 def fork[A](pa: Par[A]): Par[A] //pa设定一个新运行空间。

    68670

    java线程池(一):java线程池基本使用及Executors

    但是在我们日常开发工作中,我们绝大部分工作内容,都会分解一个个短小执行任务来执行。这样才能更加合理复用资源。这种思想就与我们之前提到协程一样。任务要尽可能小。...不过需要注意是,工作抢占线程池不能保证提交任务执行顺序。...4.线程池使用方式 在java种,线程池提供了两种方式来进行调用。分别是通过submit来提交任务。只是一种方式提交是Runnable普通线程,而且不能返回执行结果。...而另外一种方式则是提交Callable任务,返回Future对象。通过Future对象能获取到执行结果。...但是需要注意是,Future本身虽然看起来实现了异步,实际上还是个同步方法,因为其执行结果需要通过在FutureisDone()方法轮询,或者调用get方法,而get本身就是个阻塞方法

    1.3K20

    大任务拆分,让并行嗨起来!

    :execute execute类型方法在提交任务后,不会返回结果。...在提交任务后,将返回ForkJoinTask类型结果。如果提交任务是null,将抛出空指针异常,并且当任务不能按计划执行的话,将抛出任务拒绝异常。...那么现在,你则可以通过join()方法获取任务执行结果。 调用join()时,将阻塞当前线程直到对应子任务完成运行并返回结果。从源码看,join()核心逻辑由doJoin()负责。...任务窃取相关过程,可以用下面这幅图来表示,这幅图建议你收藏: 看到这里,不知你是否会有疑问:为什么工作线程总是从自己头部获取任务?为什么要这样设计?...通过这些方法,你可以了解当前工作线程、任务处理等情况。

    23910
    领券