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(); } }
待验证。。