ArrayList<Future> fl = new ArrayList<Future>();

for (int i = 0; i < 10; i++) {
  Future<String> future = executorService.submit(new TaskWithResult(i));
  fl.add(future);
}
for(int i = 0;i<fl.size();i++){
  System.out.printf("future.get() = " + fl.get(i).get());
  System.out.println("");
}

一开始,我以为 executorService.submit中先执行完的任务的返回结果集会存在fl的前面,但是经过测试发现,却并非如此。

测试代码:

public void test() throws InterruptedException, ExecutionException{
ExecutorService executorService = Executors.newCachedThreadPool(); int j = 0;
@SuppressWarnings("rawtypes")
ArrayList<Future> fl = new ArrayList<Future>();
for (int i = 0; i < 10; i++) {
Future<String> future = executorService.submit(new TaskWithResult(i));
fl.add(future);
}
for(int i = 0;i<fl.size();i++){
System.out.printf("future.get() = " + fl.get(i).get());
System.out.println("");
} } class TaskWithResult implements Callable<String> {
private int id;
public TaskWithResult(int id) {
this.id=id;
} @Override
public String call() throws Exception {
ArrayList<String> s = new ArrayList<String>();
for(int i = 0; i < (10-id)* 10000 ;i++){
String s1 = String.valueOf(id) + ':' + String.valueOf(i);
s.add(s1);
}
System.out.println("完成: " + id);
return String.valueOf(id);
}
}

执行后输入如下:

完成: 5
完成: 7
完成: 6
完成: 4
完成: 8
完成: 9
完成: 3
完成: 2
完成: 1
完成: 0
future.get() = 0
future.get() = 1
future.get() = 2
future.get() = 3
future.get() = 4
future.get() = 5
future.get() = 6
future.get() = 7
future.get() = 8
future.get() = 9

这表明,不管是哪个任务先完成,在返回值列表中的顺序是一样的。这个是如何实现的呢?

Future<V>代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞。

【java】并发执行ExecutorService的sumbit返回值的顺序问题的更多相关文章

  1. Java并发(6)带返回结果的任务执行

    携带结果的任务 JDK5提供了有可返回值的任务的执行.java.util.concurrent中Callable与Futrue用以实现带返回值的任务执行. 使用Callable与Futrue与使用Ru ...

  2. java并发中ExecutorService的使用

    文章目录 创建ExecutorService 为ExecutorService分配Tasks 关闭ExecutorService Future ScheduledExecutorService Exe ...

  3. Java线程:新特征-有返回值的线程

    http://lavasoft.blog.51cto.com/62575/222082/ Java线程:新特征-有返回值的线程 2009-11-04 17:33:56 标签:返回值 职场 线程 休闲 ...

  4. JAVA 多线程 Callable 与 FutureTask:有返回值的多线程

    java多线程中,如果需要有返回值,就需要实现Callable接口. 看例子: 先建立一个Dowork这个类,就是平时某个业务的实现 package com.ming.thread.one; impo ...

  5. java使用Filter过滤器对Response返回值进行修改

    转:java使用Filter过滤器对Response返回值进行修改 练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过 ...

  6. 转:java使用Filter过滤器对Response返回值进行修改

    练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过滤器对Response返回值进行修改 有时候在开发过程中会有这样一个 ...

  7. python执行系统命令后获取返回值的几种方式集合

    python执行系统命令后获取返回值的几种方式集合 今天小编就为大家分享一篇python执行系统命令后获取返回值的几种方式集合,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 第一种情 ...

  8. 066 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参有返回值方法

    066 01 Android 零基础入门 01 Java基础语法 08 Java方法 04 带参有返回值方法 本文知识点:带参有返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  9. 065 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参无返回值方法

    065 01 Android 零基础入门 01 Java基础语法 08 Java方法 03 带参无返回值方法 本文知识点:带参无返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

随机推荐

  1. 用SelectSingleNode()方法查找xml节点一直返回null

    代码使用如下 XmlNode root = xmlDoc.SelectSingleNode("Project"); 返回的root一直是null 查了xml文件中确实是有Proje ...

  2. 解决reportNG中文乱码(转:http://www.it610.com/article/3626590.htm)

    1.下载reportng源码      git clone  https://github.com/dwdyer/reportng.git 2.修改AbstractReporter.java      ...

  3. spring boot-17.RabbitMQ

    1.JMS&AMQP JMS(Java MessageService)实际上是指JMS API.JMS是由Sun公司早期提出的消息标准,旨在为java应用提供统一的消息操作,包括create. ...

  4. vs 小贴士

    1. ubuntu上vs code root执行 sudo code --user-data-dir="~/.vscode-root" 2. 设置vs code 打开在新的标签页打 ...

  5. python with hadoop

    python with  hdfs hdfs 可以在 linux 本地操作 bin/hdfs dfs -ls /foo 但是这种只能在 命令行 操作. 通常我们需要在程序中实现远程操作,python ...

  6. HTTP请求报文(请求行、请求头、请求体)

    HTTP协议 1.简介 HTTP协议(Hyper Text Transfer Protocol,超文本传输协议),是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的 ...

  7. Tarjan算法求有向图强连通分量并缩点

    // Tarjan算法求有向图强连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> #inc ...

  8. 11.jQuery之自定义动画

    注意:animate里面是一个对象,他有几个参数,详情可以参考官网 <style> div { position: absolute; width: 200px; height: 200p ...

  9. oracle链接报错shared memory realm does not exist

    问题描述: 前两天能够正常链接,今天来了突然不能链接,原因不详. 处理方法: 连接linux进行如下操作: 1.sqlplus /nolog 2.conn / as sysdba 3.startup ...

  10. 2019-11-29-dotnet-core-输出调试信息到-DebugView-软件

    title author date CreateTime categories dotnet core 输出调试信息到 DebugView 软件 lindexi 2019-11-29 10:14:3 ...