java 關于有序獲取多線程的返回結(jié)果問題,按提交任務的順序,收集執(zhí)行結(jié)果,而無需重新排序
問題:以前做的多線程,執(zhí)行的返回結(jié)果都是無序的,所以每次執(zhí)行完畢后還要對結(jié)果集重新進行排序,增加了耗時;
今天突然想到一個思路,在給線程池提交任務的時候,可以提前獲取任務總數(shù),創(chuàng)建一個用于接收結(jié)果集的固定大小list2,然后子線程執(zhí)行的時候把當前任務序號傳進去,處理好數(shù)據(jù)后根據(jù)序號(下標)直接把數(shù)據(jù)加到list2集合的指定位置里,
注意,在提交任務之前要先用循環(huán)把list2.add(null)把這個結(jié)果集填充到目標容量大小,防止子線程填充數(shù)據(jù)時list.set(22, "哈哈哈")時報數(shù)組越界,
因為每一個子線程都是把結(jié)果填充到list2中的指定位置,所以不存在并發(fā)問題;
先記錄一下這個想法,以后有相似場景再進行驗證一下
2024年2月26日更新--根本不需要這么麻煩,線程池可以提交帶返回結(jié)果的任務,可以直接按順序取出,例如:
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方法會等待線程執(zhí)行結(jié)束,所以只要不報錯,一定能按順序拿到結(jié)果的 System.out.println("Received response: " + result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } }
待驗證。。

浙公網(wǎng)安備 33010602011771號