用程序员的语言:5000工科男抢200女同学做女朋友,怎么完美解决
1、有人在群里喊为啥我的打印结果不对,我一看写的还挺有意思,不仅用到了
Semaphore,还有线程管控和排序问题。就帮着改了一下。
原来的代码是这样写的:
public class JiShuDemo {/*** @Description: 当只有一个线程去执行加一的操作时,最终的结果都是等于总数5000* 但是,若是两个及以上的线程 同时执行加一操作,那么最终的结果只能是 小于5000* 关于线程并发的 一个计数 demo* @Author ljc* @Date 2019/11/14 9:43**///线程总数private static int threadTotal = 200;//总数private static int clientTotal = 5000;private static volatile AtomicInteger count = new AtomicInteger(0);public static void main(String[] args) {ExecutorService exec = Executors.newCachedThreadPool();final Semaphore semaphore = new Semaphore(threadTotal);for (int i=0;i<clientTotal;i++) {exec.execute(()->{try {semaphore.acquire();add();semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}});}exec.shutdown();System.out.println("最后的总数:"+count);}private synchronized static void add(){count.incrementAndGet();}
}
add()方法加了synchronized这样的重锁,并发效率一定很低,所以我首先给他换成了AtomicInteger。
再看,打印结果一直比5000小,是因为线程池里的线程没有执行完毕,main线程就把权限抢过来了。这是典型的“秦灭六国,一统华夏”的问题。要先保证六国被灭,才能一统天下。
所以我用了CountDownLatch来保证线程执行的次序,即main线程最后一个被执行。
2、修改后的代码如下:
/*** @program: mybatis* @description: 其他人的问题* @author: Miller.FAN* @create: 2019-11-14 10:34**/
public class JiShuDemo {/*** @Description: 5000个人抢200个手机,最后还要正确显示出,每个人确实抢了一次,统计抢的次数是5000,怎么实现?* @Author ljc* @Date 2019/11/14 9:43**///线程总数private static int threadTotal = 200;//总数private static int clientTotal = 5000;private static AtomicInteger count = new AtomicInteger(0);public static void main(String[] args) {CountDownLatch countDownLatch = new CountDownLatch(5000);ExecutorService exec = Executors.newCachedThreadPool();final Semaphore semaphore = new Semaphore(threadTotal);for (int i=0;i<clientTotal;i++) {exec.execute(()->{try {semaphore.acquire();add();countDownLatch.countDown();} catch (InterruptedException e) {e.printStackTrace();}finally {semaphore.release();}});}exec.shutdown();try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("最后的总数:"+count);}private static void add(){count.incrementAndGet();}
}
用程序员的语言:5000工科男抢200女同学做女朋友,怎么完美解决相关推荐
- Java程序员Go语言入门简介
引用:Java程序员Go语言入门简介 为什么是 Go 语言 类 C 的语法,这意味着 Java.C#.JavaScript 程序员能很快的上手 有自己的垃圾回收机制 跨平台.编译即可执行无需安装依赖环 ...
- 程序员的语言“艳遇史”(一)——班长pascal
程序员的语言"艳遇史"(一) (***以下小说情节纯属虚构,供朋友们在紧张编程后轻松一下,如有雷同纯属巧合,切勿对号入座***) 地狱里,一个曾经的程序员经不过魔鬼们的严刑拷打,终 ...
- 黑马程序员——c语言学习心得——函数传递二维数组
黑马程序员--c语言学习心得--函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化. 变量 ...
- 黑马程序员C语言基础(第八天)复合类型(自定义类型)(结构体)、共用体(联合体)、枚举enum、 typedef
黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...
- 黑马程序员C语言基础(第七天)内存管理
黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...
- 黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数
https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver 黑马程序员C语言基础(第五天)运算符与表达式.程 ...
- 黑马程序员C语言基础(第三天)
黑马程序员C语言基础(一)第三天 https://www.bilibili.com/video/BV15W411K7k6?p=40 文章目录 低级语言与高级语言 c语言优缺点 c语言应用领域 通过gc ...
- 程序员出差是去干什么_为什么女生不适合做程序员?原来互联网公司女生少,是由于这几点...
程序员在一般自嘲码农,这个职业有自身缺陷性加班加点特别多,而且整体对着电脑,对皮肤辐射比较大,基本上基于以上两点选择做程序员的妹子不是很多.从现实中的男女程序员的比例差别很大,经常一个研发团队里面都没 ...
- java p8级别_JAVA程序员月入5000+很迷茫,如何能在一年内改变达到月入过万?
生活中有那样一群人,他们总能是很聪明有主见,知道自己在什么时候该做什么.在什么时候该选什么,我们也能这样该多好呀!不用羡慕他们,看完本文你就能知道. 正文: 从标题来看,主线不是"如何能在一 ...
最新文章
- 使用可进化的AutoML发现神经网络架构
- 开发日记-20190829 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 5
- 最小割板子题——[USACO5.4]奶牛的电信
- java定时器偶尔重复推送_在Java中创建重复的定时器提醒
- html div剩下高度设置,使div填充剩余屏幕空间的高度
- linux 基准测试_如何对Linux系统进行基准测试:3个开源基准测试工具
- 适用于ELment-UI级联多选框,数据回填,根据子节点的值查找完整路径
- leetcode 1221 python
- B00010 map
- Spring @Cacheable设置过期时间
- 轻量级日志收集转发 | fluent-bit外部插件详解(三)
- python 网络音乐播放器(二):tkinter 实现歌词同步滚动
- 记录:中债|中证|上清所比较容易混淆的金融大机构
- java apache类库_java-类库-Apache Commons补充
- FPGA基础实验:点亮LED
- java经典递归 背包问题
- Linux使用本地光盘制作yum源
- uniapp 图标配置
- 千锋教育python2104期总结day2
- Matlab怎么从table变成matrix