如何让线程等待另一个线程完成?Java多线程场景技术求助
解决方案:让Asistent线程等待前一个任务完成
要实现Asistent线程提交后等待前一个线程执行完成,核心是跟踪每个提交任务的执行状态,让Asistent在自身执行前等待上一个任务的完成信号。具体实现步骤如下:
1. 修改Asistent类,添加等待逻辑
给Asistent类增加构造参数,传入上一个任务的Future对象,在run方法中通过Future.get()阻塞等待上一个任务完成:
class Asistent implements Runnable { private final Future<?> previousTask; // 传入上一个任务的Future实例 public Asistent(Future<?> previousTask) { this.previousTask = previousTask; } @Override public void run() { // 若存在上一个任务,等待其执行完成 if (previousTask != null) { try { previousTask.get(); } catch (InterruptedException e) { // 恢复线程中断状态,避免后续逻辑异常 Thread.currentThread().interrupt(); return; } catch (ExecutionException e) { // 处理上一个任务执行失败的情况,可根据业务需求调整 e.printStackTrace(); return; } } // 此处编写Asistent的业务逻辑 System.out.println("Asistent 开始执行任务"); // ... 你的业务代码 } }
2. 修改UceniciThread类,跟踪最后提交的任务
在UceniciThread中维护一个Future变量,记录最后提交的任务,每次提交Asistent时将该变量传入,提交后更新变量:
import java.util.Random; import java.util.concurrent.*; public class UceniciThread implements Runnable { private final ExecutorService studenti; private final int n; private Future<?> lastSubmittedTask; // 记录最后提交的任务实例 public UceniciThread(ExecutorService studenti, int n) { this.studenti = studenti; this.n = n; } @Override public void run() { Random r = new Random(); for (int i = 0; i < n; i++) { boolean sansa = r.nextBoolean(); if (sansa) { // 提交Asistent,传入上一个任务的Future lastSubmittedTask = studenti.submit(new Asistent(lastSubmittedTask)); } else { // 提交Profesor,直接更新最后任务记录(Profesor无需等待) lastSubmittedTask = studenti.submit(new Profesor()); } } } }
补充说明
- 上述代码默认Profesor线程无需等待前一个任务,可直接并行执行;若Profesor也需要等待,只需参照Asistent的逻辑修改即可。
Future.get()会阻塞当前线程直到任务完成,若上一个任务被中断或执行失败,会抛出对应异常,需根据业务场景合理处理。- 原代码中的
CyclicBarrier若未实际使用可直接移除,若有其他业务用途可保留。
内容的提问来源于stack exchange,提问作者Nikola Nikitović
相关产品推荐
相关产品推荐

