java多线程提交任务并返回结果

  • Post author:
  • Post category:java


最近工作中有需要短时间内提交大量请求,并获取响应结果,最终选择了CompletionService接口来实现,它整合了Executor和BlockingQueue的功能。你可以将Callable任务提交给它去执行,然后使用类似于队列中的take方法获取线程的返回值。具体jdk的解释是:将生产新的异步任务与使用已完成任务的结果分离开来的服务。生产者 submit 执行的任务。使用者 take 已完成的任务,并按照完成这些任务的顺序处理它们的结果。例如,CompletionService 可以用来管理异步 IO ,执行读操作的任务作为程序或系统的一部分提交,然后,当完成读操作时,会在程序的不同部分执行其他操作,执行操作的顺序可能与所请求的顺序不同。

以下是示例代码

public List<JSONObject>  getDataCompletionService(List<JSONObject> paramters){
        //使用线程池,具体corePoolSize:活跃线程数,maximumPoolSize最大线程数根据需要自己定义
        ThreadPoolExecutor t=new ThreadPoolExecutor(4,8,
                2000L, TimeUnit.SECONDS,new LinkedBlockingQueue<>());
        CompletionService<JSONObject> cs = new ExecutorCompletionService<JSONObject>(t);
        for(int i =0;i<paramters.size();i++){
            int j=i;
            cs.submit(new Callable<JSONObject>() {
                public JSONObject call() throws Exception {
                    JSONObject jsonObject1 =new JSONObject();
                    //具体业务逻辑实现
                    return jsonObject1;
                }
            });
        }
        for(int i =0;i<paramters.size();i++) {
            try {
                jsonObjects.add(cs.take().get());
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
        t.shutdown();
        return jsonObjects;
    }
}

有需要的可以以这个例子作为参考,后面会学习通过Java8的CompletableFuture来解决问题。



版权声明:本文为jiangxiaohe123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。