You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让线程等待另一个线程完成?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ć

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:36:14