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. 在Spring容器外调用bean

    这个东西源于这种需求:一个应用丢到服务其后,不管用户有没有访问项目,这个后台线程都必须给我跑,而且这个线程还调用了Spring注入的bean,这样自然就会想到去监听Servlet的状态,当Servle ...

  2. 手机app打开的web,在打开chrome浏览器

    手机app打开的web在,打开chrome浏览器 <a href='intent://#Intent;action=android.intent.action.VIEW;scheme=googl ...

  3. Java的HashMap键值对存储结构解析

    容器总体结构 Map存储键值对的数据结构是“数组+链表”的结构,结合了数组查询数据快和链表增删数据快的优点:用Entry[]存储键值对,Entry为类类型,类里面有四个属性:hash.K.V.next ...

  4. 【VS开发】修改MainFrame窗口名称1

    在VS2010下新建一个MFC的多文档应用程序,程序默认的标题是"文档名-工程名".图标默认的是写着MFC的三个方块.但在很多软件中都不是使用的默认设置,开发者们都将标题和图标改过 ...

  5. Java类初始化和实例初始化过程

    1.类初始化过程 一个类要创建实例需要先加载并初始化该类 main方法所在的类需要先加载和初始化 一个子类要初始化需要先初始化父类 一个类初始化就是执行<client>()方法(编译器生成 ...

  6. 小记---------Elasticsear搭建

    Elasticsear搭建 创建用户: useradd elasticsearch passwd elasticsearch   1.解压 tar -zxvf elasticsearch-5.5.2. ...

  7. GPIB、USB、PCI、PCI Express和以太网/LAN/LXI

    GPIB 我们研究的第一个总线是IEEE 488总线,较为熟悉的称谓是GPIB(通用接口总线).GPIB是一种在业界已经得到证明的专为仪器控制应用设计的总线.GPIB在过去30年来一直是鲁棒的.可靠的 ...

  8. Jquery复习(六)之remove()易忘点和trigger()

    过滤被删除的元素 jQuery remove() 方法也可接受一个参数,允许您对被删元素进行过滤. 该参数可以是任何 jQuery 选择器的语法. 下面的例子删除 class="italic ...

  9. Hack the box: Bastion

    介绍 目标:10.10.10.134 (Windows) Kali:10.10.16.65 In conclusion, Bastion is not a medium box. But it wou ...

  10. vue.js(3)--v-bind与v-on

    vue中的v-bind与v-on的使用 (1)实例 <!DOCTYPE html> <html lang="en"> <head> <me ...