Callable Future Executor

2024-08-28 15:18
文章标签 executor callable future

本文主要是介绍Callable Future Executor,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 一般通过继承Thread还有实现Runnable,都不可以有返回值,不可以声明检查异常。
    Callable和Future,通过ExecutorService的submit方法执行Callable,并返回给Future,这里返回值只有一个,ExecutorService继承自Executor,通过使用Executor执行器来操作。
public class CallableAndFuture {public static void main(String[] args) {ExecutorService threadPool = Executors.newSingleThreadExecutor();Future<Integer> future = threadPool.submit(new Callable<Integer>() {//提交线程,需要个线程。public Integer call() throws Exception {return new Random().nextInt(100);}});}

接下来是执行多个带返回值的任务,并取得多个返回值:
可以使用CompletionService,你要多个值那就来一个Future集合

public class CallableAndFuture {public static void main(String[] args) {ExecutorService threadPool = Executors.newCachedThreadPool();CompletionService<Integer> cs = new ExecutorCompletionService<Integer>(threadPool);for(int i = 1; i < 5; i++) {final int taskID = i;cs.submit(new Callable<Integer>() {public Integer call() throws Exception {return taskID;}});}// 可能做一些事情for(int i = 1; i < 5; i++) {try {System.out.println(cs.take().get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}}
} 
  1. Callable和Future,一个产生结果,一个拿到结果。 Callable接口类似于Runnable,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,Future可以拿到异步执行任务的返回值。

`

``
public class CallableAndFuture {
public static void main(String[] args) {Callable<Integer>c=new Callable<Integer>() {@Overridepublic Integer call() throws Exception {// TODO Auto-generated method stubreturn new Random().nextInt(10);}};FutureTask<Integer>f=new FutureTask<Integer>(c);
}
}
  1. FutureTask实现了两个接口,Runnable和Future,所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值
  2. FutureTask实现了两个接口,Runnable和Future,所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值,那么这个组合的使用有什么好处呢?假设有一个很耗时的返回值需要计算,并且这个返回值不是立刻需要的话,那么就可以使用这个组合,用另一个线程去计算返回值,而当前线程在使用这个返回值之前可以做其它的操作,等到需要这个返回值时,再通过Future得到。

原文地址:http://blog.csdn.net/ghsau/article/details/7451464,转载请注明

这篇关于Callable Future Executor的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115127

相关文章

Java线程池和Executor框架-面试与分析

线程池 什么是线程池?为什么要用线程池? 在Java并发框架中,线程池时使用最多的东西,几乎所有需要异步并发执行任务的程序都可以使用线程池。 使用线程池带来的好处: 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的损耗提高响应时间。当任务到达时,任务可以不需要等待线程创建就可以立即执行提高线程的可管理性。线程是稀缺资源,如果无限创建,会降低系统的稳定性,使用线程可以进行统一分配

Executor 端长时容错详解

福利部分: 《大数据成神之路》大纲 大数据成神之路 《几百TJava和大数据资源下载》 资源下载 本系列内容适用范围:* 2018.11.02 update, Spark 2.4 全系列 √ (已发布:2.4.0)* 2018.02.28 update, Spark 2.3 全系列 √ (已发布:2.3.0 ~ 2.3.2)* 2017.07.11 update, Spark 2.

【硬刚Java并发】JUC基础(五):实现 Callable 接口

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Java并发部分补充。 1 Callable 接口 Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果

Java并发编程:Callable和Future使用

在Java中,创建线程一般有两种方式,一种是继承Thread类,一种是实现Runnable接口。然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果。我们一般只能采用共享变量或共享存储区以及线程通信的方式实现获得任务结果的目的。 不过,Java中,也提供了使用Callable和Future来实现获取任务结果的操作。Callable用来执行任务,产生结果,而Future用来获得结果。 C

std::future和std::promise详解(原理、应用、源码)

在编程实践中,我们常常需要使用异步调用。通过异步调用,我们可以将一些耗时、阻塞的任务交给其他线程来执行,从而保证当前线程的快速响应能力。还有一些场景可以通过将一个任务,分成多个部分然后将这部分交给多个线程来进行并发执行,从而完成任务的快速计算执行,提高应用性能。这里就需要用到异步调用的概念 异步调用,就是当前线程将一个任务交给另外一个线程来进行执行,当前线程会接着执行当前任务,不需要等待这个交付

Future 原理模拟

大家已经知道Future可以异步返回结果,但是其中的原理 却并不是所有人都懂  今天偶然看见了一段模拟原理的代码 就记录一下 首先大致介绍下其中的原理 : 在客户端请求的时候,直接返回客户端需要的数据(此数据不一定完整,只是简单的一点不耗时的操作),但是客户端并不一定马上使用所有的信息,此时就有了时间去完善客户需要的信息  大致原理如此 说到底就是一个简单的异步操作,下面贴上源码 并做简单的介绍

Java 通过Future来对任务进行取消

本节我们将通过Java中的Future实现对于提交的任务进行取消。ExecutorService.submit将返回一个Future来描述任务,Future拥有一个cancel方法,该方法带有一个boolean类型的参数mayInterruptIfRunning,表示取消操作是否成功(这个参数只是表示任务是否能够接收中断,而不是表示任务是否能检测并处理中断)。如果mayInterrup

【Python报错已解决】`TypeError: ‘numpy.ndarray‘ object is not callable`

引言: 在编程中,你是否遇到过尝试调用一个Numpy数组对象时出现了TypeError: 'numpy.ndarray' object is not callable的报错?这个问题通常是由于误将Numpy数组当成了一个函数来调用。接下来,我们将分析这个问题并提供解决方案。 一、问题描述: 1.1 报错示例: import numpy as np# 创建一个Numpy数组arra

论文笔记:Estimating future human trajectories from sparse time series data

sigspatial 2023 humob竞赛paper hiimryo816/humob2023-MOBB (github.com) 1 数据集分析 这里只分享了HuMob数据集1的内容 1.1 假日分析 对HuMob数据集#1地理数据的方差分析显示了非工作日的模式 在某些天的y坐标方差中有显著的峰值,这是非工作日的象征【x坐标有相似的模式】 ——>识别了任务1数据集中最有可能是

Java源码分析----Future

一般使用多线程操作的时候会使用Thread+Runnable进行处理,但是这种方式中,Runnable是没有返回值的,假设我们需要获取Runnable的返回值,可能需要如下特殊处理,伪代码如下 String returnValue1 = "";String returnValue2 = "";CountDownLatch cdl = ....new Thread(()->{// xxxx操