java 关于有序获取多线程的返回结果问题,按提交任务的顺序,收集执行结果,而无需重新排序

问题:以前做的多线程,执行的返回结果都是无序的,所以每次执行完毕后还要对结果集重新进行排序,增加了耗时;

 

今天突然想到一个思路,在给线程池提交任务的时候,可以提前获取任务总数,创建一个用于接收结果集的固定大小list2,然后子线程执行的时候把当前任务序号传进去,处理好数据后根据序号(下标)直接把数据加到list2集合的指定位置里,

注意,在提交任务之前要先用循环把list2.add(null)把这个结果集填充到目标容量大小,防止子线程填充数据时list.set(22, "哈哈哈")时报数组越界,

因为每一个子线程都是把结果填充到list2中的指定位置,所以不存在并发问题;

先记录一下这个想法,以后有相似场景再进行验证一下

 

 

2024年2月26日更新--根本不需要这么麻烦,线程池可以提交带返回结果的任务,可以直接按顺序取出,例如:

for (String url : urls) {
  Callable<String> task = () -> {
    return performRequest(url);
  };
  Future
<String> future = executor.submit(task);   futures.add(future); } for (Future<String> future : futures) {   try {     String result = future.get();//这个get方法会等待线程执行结束,所以只要不报错,一定能按顺序拿到结果的     System.out.println("Received response: " + result);   } catch (InterruptedException | ExecutionException e) {     e.printStackTrace();   } }

 

待验证。。

 

posted @ 2024-02-06 15:27  黄大虾  阅读(89)  评论(0编辑  收藏  举报