zoukankan      html  css  js  c++  java
  • 【java】并发执行ExecutorService的sumbit返回值的顺序问题

    
    

      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()会使当前线程阻塞。

  • 相关阅读:
    作为Web开发人员,我为什么喜欢Google Chrome浏览器
    PostgreSQL数据类型
    Postgres 9.11 网络地址类型函数和操作符
    失败如何助你升入最高管理层
    你真的会用Gson吗?Gson使用指南(2)
    你真的会用Gson吗?Gson使用指南(1)
    软件开发的一些"心法"
    Json解析教程(四.FastJson 的使用)
    JSON数据之使用Fastjson进行解析(一)
    alibaba fastjson常见问题FAQ
  • 原文地址:https://www.cnblogs.com/seyjs/p/7017368.html
Copyright © 2011-2022 走看看