Java中如何并行执行方法内的指定代码片段
如何正确并行执行方法内部分代码并准确计时?
你当前的代码存在一个关键问题:调用pool.shutdown()后立即记录end时间,此时doSomethingOne、doSomethingTwo、doSomethingThree这三个任务大概率还在后台执行,所以最终的计时结果并不是这三个方法并行执行的实际耗时。
要实现「三个方法在start初始化后开始执行,全部完成后再初始化end」的需求,你需要等待所有提交的任务完成后再计算时间,以下是两种可行的实现方式:
方式一:使用awaitTermination等待任务完成
public static void someMethod() { // 三个任务只需3个线程,无需创建15个线程浪费资源 final ExecutorService pool = Executors.newFixedThreadPool(3); long start = System.nanoTime(); pool.execute(() -> doSomethingOne()); pool.execute(() -> doSomethingTwo()); pool.execute(() -> doSomethingThree()); pool.shutdown(); // 停止接收新任务 try { // 等待所有任务执行完成,设置1小时超时(可根据实际调整) if (!pool.awaitTermination(1, TimeUnit.HOURS)) { // 超时未完成则强制关闭线程池 pool.shutdownNow(); } } catch (InterruptedException e) { // 等待过程被中断时,强制关闭并恢复当前线程的中断状态 pool.shutdownNow(); Thread.currentThread().interrupt(); } long end = System.nanoTime(); System.out.println("并行执行耗时:" + (end - start) / 1_000_000_000L + "秒"); }
方式二:使用Future跟踪任务状态
public static void someMethod() { final ExecutorService pool = Executors.newFixedThreadPool(3); long start = System.nanoTime(); // 提交任务并获取Future对象,用于跟踪任务执行状态 Future<?> future1 = pool.submit(() -> doSomethingOne()); Future<?> future2 = pool.submit(() -> doSomethingTwo()); Future<?> future3 = pool.submit(() -> doSomethingThree()); try { // 阻塞等待每个任务完成 future1.get(); future2.get(); future3.get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } finally { // 任务完成后关闭线程池 pool.shutdown(); } long end = System.nanoTime(); System.out.println("并行执行耗时:" + (end - start) / 1_000_000_000L + "秒"); }
额外注意事项:
- 修正原代码的语法错误:
doSomethingOne需要改为doSomethingOne(),否则会编译失败。 - 线程池大小建议匹配任务数量,避免不必要的线程上下文切换。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

