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女同学做女朋友,怎么完美解决相关推荐

  1. Java程序员Go语言入门简介

    引用:Java程序员Go语言入门简介 为什么是 Go 语言 类 C 的语法,这意味着 Java.C#.JavaScript 程序员能很快的上手 有自己的垃圾回收机制 跨平台.编译即可执行无需安装依赖环 ...

  2. 程序员的语言“艳遇史”(一)——班长pascal

    程序员的语言"艳遇史"(一) (***以下小说情节纯属虚构,供朋友们在紧张编程后轻松一下,如有雷同纯属巧合,切勿对号入座***) 地狱里,一个曾经的程序员经不过魔鬼们的严刑拷打,终 ...

  3. 黑马程序员——c语言学习心得——函数传递二维数组

    黑马程序员--c语言学习心得--函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化.    变量 ...

  4. 黑马程序员C语言基础(第八天)复合类型(自定义类型)(结构体)、共用体(联合体)、枚举enum、 typedef

    黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...

  5. 黑马程序员C语言基础(第七天)内存管理

    黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...

  6. 黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数

    https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver 黑马程序员C语言基础(第五天)运算符与表达式.程 ...

  7. 黑马程序员C语言基础(第三天)

    黑马程序员C语言基础(一)第三天 https://www.bilibili.com/video/BV15W411K7k6?p=40 文章目录 低级语言与高级语言 c语言优缺点 c语言应用领域 通过gc ...

  8. 程序员出差是去干什么_为什么女生不适合做程序员?原来互联网公司女生少,是由于这几点...

    程序员在一般自嘲码农,这个职业有自身缺陷性加班加点特别多,而且整体对着电脑,对皮肤辐射比较大,基本上基于以上两点选择做程序员的妹子不是很多.从现实中的男女程序员的比例差别很大,经常一个研发团队里面都没 ...

  9. java p8级别_JAVA程序员月入5000+很迷茫,如何能在一年内改变达到月入过万?

    生活中有那样一群人,他们总能是很聪明有主见,知道自己在什么时候该做什么.在什么时候该选什么,我们也能这样该多好呀!不用羡慕他们,看完本文你就能知道. 正文: 从标题来看,主线不是"如何能在一 ...

最新文章

  1. 使用可进化的AutoML发现神经网络架构
  2. 开发日记-20190829 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 5
  3. 最小割板子题——[USACO5.4]奶牛的电信
  4. java定时器偶尔重复推送_在Java中创建重复的定时器提醒
  5. html div剩下高度设置,使div填充剩余屏幕空间的高度
  6. linux 基准测试_如何对Linux系统进行基准测试:3个开源基准测试工具
  7. 适用于ELment-UI级联多选框,数据回填,根据子节点的值查找完整路径
  8. leetcode 1221 python
  9. B00010 map
  10. Spring @Cacheable设置过期时间
  11. 轻量级日志收集转发 | fluent-bit外部插件详解(三)
  12. python 网络音乐播放器(二):tkinter 实现歌词同步滚动
  13. 记录:中债|中证|上清所比较容易混淆的金融大机构
  14. java apache类库_java-类库-Apache Commons补充
  15. FPGA基础实验:点亮LED
  16. java经典递归 背包问题
  17. Linux使用本地光盘制作yum源
  18. uniapp 图标配置
  19. 千锋教育python2104期总结day2
  20. Matlab怎么从table变成matrix

热门文章

  1. 群发邮件进入垃圾邮件的解决之道
  2. 夯实C++基础学习笔记
  3. c语言调用oracle存储过程,Oracle存储过程
  4. Visual Studio 2015正式版/产品密钥
  5. 吞吐量和IOPS测试
  6. 【c++从菜鸡到王者】第六篇:详解晦涩难懂的c++语法
  7. MTK MT6169 2G用户指南参考资料
  8. SpringMVC创建Maven工程
  9. 设备上报二进制数据在 IoT 平台解析实践
  10. 在eclipse中用java代码测试是否成功连接数据库