多线程问题记录(自己的理解)
// 主线程及 待处理的数据
List<User> users = 业务处理后形成的集合
// CountDownLatch 用来处理多线程等待问题,如 主线程 -> 多线程 -> 等待多线程全部执行完成 -> 主线程
// 初始化计数器
CountDownLatch downLatch = new CountDownLatch(users.size());
// 开启多线程任务
users.forEach(user -> {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("当前线程:" + Thread.currentThread().getName());
try {
// user的业务处理方法
...
...
} catch (Exception e) {
e.printStackTrace();
} finally {
downLatch.countDown();
// 执行结束后计数器减 1 , 计数器结束后多线程任务结束
// 此方法最好放finally内部, 不然上面user业务代码异常后可能导致
// downLatch.await() 一直等待,阻塞线程
}
}
}).start();
});
// 如果计数器不为零就等待
downLatch.await();
// 线程内部做集合修改的话用做线程安全,不然可能产生错误
List<User> users= Collections.synchronizedList(new ArrayList<>());
来源:CSDN
作者:丶想友
链接:https://blog.csdn.net/qq_37813031/article/details/104806557