100个线程各累加100次
题目
100个线程, 每个线程累加100次, 并保证线程安全;
解法一
基本思路
- 使用 Java 自带的
conccruent
工具包中的AtomicInteger
原子类, 调用其incrementAndGet()
方法可以保证线程安全的进行累加; - 因为涉及到100个线程, 可以使用
FixedThreadPool
线程池来管理; - 线程池使用之后, 需要注意关闭;
实现代码
java
public class ThreadsAccumulate {
// 计数器 原子类
private static final AtomicInteger COUNTER = new AtomicInteger(0);
public static void main(String[] args) throws InterruptedException {
// 创建线程数为100的线程池
ExecutorService executor = Executors.newFixedThreadPool(100);
// 提交一百个任务 每个任务执行100次
for (int i = 0; i < 100; i++) {
executor.submit(() -> {
for (int j = 0; j < 100; j++) {
// 使用原子操作递增 线程安全
COUNTER.incrementAndGet();
}
});
}
// 关闭线程池 不接受新的任务 但会继续处理处理等待队列中的任务
executor.shutdown();
// 等待所有任务完成 保证任务执行结束
executor.awaitTermination(1, TimeUnit.HOURS);
// 输出最终计数值
System.out.println(COUNTER.get());
}
}