我是少侠露飞。学习塑造人生,技术改变世界。
问题描述
启动三个线程对初始值为0的数字进行累加,要求每个线程累加十次,最终输出30。
问题分析
首先需要启动三个线程(一不小心说了句废话),线程体里面就用循环执行十次自增操作。但是要注意,自增操作不是原子性操作,所以要加锁,或者使用原子变量。
代码很简单,实现一下:
public class Main {
private static final ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("Main-%d").build();
private static final ExecutorService executorService = new ThreadPoolExecutor(3, 3, 100L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024), threadFactory, new ThreadPoolExecutor.AbortPolicy());
public static void main(String[] args) throws InterruptedException {
AtomicInteger num = new AtomicInteger(0);
for (int i = 0; i < 3; i++) {
executorService.submit(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
num.getAndIncrement();
}
}
});
}
System.out.println(num);
}
}
当你一顿操作猛如虎,点击一运行,发现结果是0,那是自然,主线程启动三个线程之后,接着就执行输出了,三个工作线程还没自增完成呢。这个时候你可能会想到用sleep
方法,输出语句之前,让主线程休眠100毫秒。诚然,该方法可行,但是,你不觉得这种操作有点low嘛。
而且真实开发里,正经人谁用sleep方法啊,因为sleep太不可控啦,我就问一点,sleep方法的休眠时间你怎么预估的?是不是懵圈了,因为你完全不知道其它线程执行多久。当然你会说,为确保稳妥,我让它尽量休眠长一点,那好,我这里让主线程休眠一天一夜,程序点击运行之后,大家都回去洗洗睡吧,明天过来看结果。
那有什么办法吗?
当然有啦,还记得我们大名鼎鼎的闭锁CountDownLatch
,实现多线程之间的互相等待。关于CountDownLatch可以参考下篇博客↓
Java并发编程(三):CountDownLatch(闭锁)原理及实践
最终代码
public class Main {
private static final ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("Main-%d").build();
private static final ExecutorService executorService = new ThreadPoolExecutor(3, 3, 100L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024), threadFactory, new ThreadPoolExecutor.AbortPolicy());
public static void main(String[] args) throws InterruptedException {
AtomicInteger num = new AtomicInteger(0);
CountDownLatch countDownLatch = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
executorService.submit(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
num.getAndIncrement();
}
countDownLatch.countDown();
}
});
}
countDownLatch.await();
System.out.println(num);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/13481.html