您的位置:首页 >如何安全获取线程执行结果列表
发布于2026-04-18 阅读(0)
扫一扫,手机访问

本文介绍一种线程安全、时间精确的方式,通过自定义 ThreadUnion 管理多线程生命周期,并实时收集每个完成线程的名称、结束时间及异常信息,避免 ConcurrentModificationException 和时间戳错乱问题。
本文介绍一种线程安全、时间精确的方式,通过自定义 `ThreadUnion` 管理多线程生命周期,并实时收集每个完成线程的名称、结束时间及异常信息,避免 `ConcurrentModificationException` 和时间戳错乱问题。
在并发编程中,简单地用 Thread.start() 启动线程后,若需统一收集其执行结果(如完成时间、是否抛出异常),直接维护共享集合极易引发线程安全问题——正如提问中出现的 ConcurrentModificationException 和 finished 时间戳早于启动时刻等现象。根本原因在于:结果写入与遍历未同步、isAlive() 判定时机不准确、以及 LocalDateTime.now() 调用位置不当。
public class ThreadUnion {
private final String unionName;
private final AtomicInteger threadCounter = new AtomicInteger(0);
private final List<FinishedThreadResult> results = new CopyOnWriteArrayList<>();
private ThreadUnion(String name) {
this.unionName = name;
}
public static ThreadUnion newInstance(String name) {
return new ThreadUnion(name);
}
public Thread newThread(Runnable task) {
String threadName = String.format("%s-worker-%d", unionName, threadCounter.getAndIncrement());
Thread t = new Thread(() -> {
try {
task.run();
// ✅ 正常完成:立刻记录,时间精准
results.add(new FinishedThreadResult(threadName));
} catch (Throwable e) {
// ✅ 异常完成:同样立即记录,含异常
results.add(new FinishedThreadResult(threadName, e));
}
}, threadName);
// ⚠️ 不再设置 UncaughtExceptionHandler!
// 因为 run() 已包裹全部逻辑,所有异常均被显式捕获
return t;
}
public List<FinishedThreadResult> results() {
// ✅ 返回不可修改副本,保障调用方安全
return Collections.unmodifiableList(new ArrayList<>(results));
}
}可靠收集线程结果的关键,在于将「完成事件」建模为线程内主动上报行为,而非外部被动探测。通过封装 Runnable、统一异常处理路径、选用合适并发容器,即可在不引入额外框架的前提下,实现线程安全、时间精确、语义清晰的结果聚合机制。
下一篇:网易云音乐单曲循环设置方法
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9