如何让主线程等待同时启动的多线程执行完成后再打印结果
解决多线程同时排序并等待全部完成的问题
你的核心问题在于原代码中每次启动线程后立刻调用t.join(),这会强制主线程等待当前线程执行完毕才会启动下一个线程,完全失去了多线程并行的意义。要实现所有排序线程同时执行,主线程等待全部完成后再打印数组,可以通过以下两种方式修改:
方式一:手动收集线程并统一等待
先创建并启动所有线程,将线程对象存储到列表中,待所有线程启动完成后,再逐个调用join()等待它们执行结束。
修改后的代码:
public class SortingRunner { final static int CAPACITY = 10_000; final static int FROM = -100; final static int TO = 100; final static int COUNT_ARRAYS = 4; public static void main(String[] args) throws InterruptedException { int[][] arrays = Utils.generateTheSameRandomArrays(CAPACITY, FROM, TO, COUNT_ARRAYS); List<Sorting> sortingList = List.of( new BubbleSort(arrays[0]), new SelectionSort(arrays[1]), new MergeSort(arrays[2]), new QuickSort(arrays[3]) ); // 存储所有线程对象 List<Thread> threads = new ArrayList<>(); for (Sorting sorting : sortingList) { Thread t = new Thread(() -> Utils.speedTest(sorting)); threads.add(t); t.start(); // 启动线程,不立即等待 } // 等待所有线程执行完成 for (Thread t : threads) { t.join(); } Utils.printArrays(arrays); } }
方式二:使用ExecutorService管理线程池
借助Java的ExecutorService可以更优雅地管理多线程任务,无需手动维护线程对象,还能设置超时时间避免无限等待。
修改后的代码:
public class SortingRunner { final static int CAPACITY = 10_000; final static int FROM = -100; final static int TO = 100; final static int COUNT_ARRAYS = 4; public static void main(String[] args) throws InterruptedException { int[][] arrays = Utils.generateTheSameRandomArrays(CAPACITY, FROM, TO, COUNT_ARRAYS); List<Sorting> sortingList = List.of( new BubbleSort(arrays[0]), new SelectionSort(arrays[1]), new MergeSort(arrays[2]), new QuickSort(arrays[3]) ); // 创建与任务数量匹配的固定线程池 ExecutorService executor = Executors.newFixedThreadPool(COUNT_ARRAYS); // 提交所有排序任务到线程池 for (Sorting sorting : sortingList) { executor.submit(() -> Utils.speedTest(sorting)); } executor.shutdown(); // 关闭线程池,不再接受新任务 // 等待所有任务完成,设置1分钟超时时间可根据需求调整 executor.awaitTermination(1, TimeUnit.MINUTES); Utils.printArrays(arrays); } }
两种方式都能实现所有排序线程并行执行,主线程等待全部任务完成后再执行数组打印操作。其中线程池方式更适合复杂的多线程场景,具备更好的可维护性和扩展性。
内容的提问来源于stack exchange,提问作者zotov_l88
相关产品推荐
相关产品推荐

