package com.chinamobile.cmss.ms.testJava.pass;import java.util.Collections;
import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;/*** 面试题:发一副扑克牌,一个发牌员,3个打牌员,用多线程*/
public class TestCards {static volatile  LinkedList<Poker> cardStore = new LinkedList<>();//顺序控制变量,让接牌员1,2,3顺序获取牌static volatile  int receiveState = 1;static volatile int size = 0;//一整副牌static LinkedList<Poker> pokers = new LinkedList<>();static ReentrantLock reentrantLock = new ReentrantLock();static Condition senderCondition = reentrantLock.newCondition();static Condition receiveCondition = reentrantLock.newCondition();static{//准备一副扑克牌String[] cardcolor = {"黑桃","红心","方块","梅花"};for (int i = 0; i < cardcolor.length; i++) {for (int j = 0; j < Card.values().length; j++) {Poker poker = new Poker(cardcolor[i], Card.values()[j].cardValue);pokers.add(poker);}}pokers.add(new Poker(null, "Black G"));pokers.add(new Poker(null, "Red G"));}public static void main(String[] args) {//牌打乱顺序Collections.shuffle(pokers);//创建一个发牌线程,3个接收线程new Thread(() -> {//发牌线程如果不把54张牌发完,不结束while(pokers.size() != 0){sendCard();}}, "发牌员").start();for (int i = 1; i <= 3 ; i++) {new Thread(new MyTask(i), "接牌员" + i).start();}}//发牌员发牌static void sendCard(){try{reentrantLock.lock();while(cardStore.size() != 0){try {senderCondition.await();} catch (InterruptedException e) {e.printStackTrace();}}Poker poker = pokers.poll();cardStore.offer(poker);System.out.println("发牌员发牌:" + poker.toString());receiveCondition.signalAll();} finally {reentrantLock.unlock();}}static class MyTask implements Runnable{private int currentThreadNum;public MyTask(int currentThreadNum) {this.currentThreadNum = currentThreadNum;}@Overridepublic void run() {//接牌员不把54张牌拿到手不结束while (size != 54){if(receiveState == currentThreadNum){getCard();size++;if(receiveState == 3){receiveState = 1;} else {receiveState++;}}}System.out.println(size);}}//打牌员拿牌static void getCard(){try{reentrantLock.lock();while(cardStore.size() == 0){try {receiveCondition.await();} catch (InterruptedException e) {e.printStackTrace();}}Poker poll = cardStore.poll();System.out.println(Thread.currentThread().getName() + ":" + poll.toString());senderCondition.signalAll();} finally {reentrantLock.unlock();}}static class Poker{String color;String cardValue;public Poker(String color, String cardValue) {this.color = color;this.cardValue = cardValue;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}@Overridepublic String toString() {return "Poker{" +"color='" + color + '\'' +", cardValue='" + cardValue + '\'' +'}';}}enum Card{CARD_A(1, "A"),CARD_2(2, "2"),CARD_3(3, "3"),CARD_4(4, "4"),CARD_5(5, "5"),CARD_6(6, "6"),CARD_7(7, "7"),CARD_8(8, "8"),CARD_9(9, "9"),CARD_10(10, "10"),CARD_J(11, "J"),CARD_Q(12, "Q"),CARD_K(13, "K");int value;String cardValue;Card(int value, String cardValue) {this.value = value;this.cardValue = cardValue;}@Overridepublic String toString() {return super.toString();}}
}

多线程扑克牌发牌小白实现 -- 记录下自己代码点滴相关推荐

  1. 【 Linux 】记录下第一次使linux系统遇到的问题(系统安装、配置查看、搜狗输入法安装)

    作为一个有梦想的技术人,无论你是搞硬件的还是搞软件的,相信大家都有一颗探索的心,而Linux操作系统就不该成为一种神秘的系统,于是作为小白的我也开始玩一玩linux系统了,系统的安装是十分的简单,下载 ...

  2. Python面向对象编程扑克牌发牌程序,另含大量Python代码!

    1. 题目 编写程序, 4名牌手打牌,计算机随机将52张牌(不含大小鬼)发给4名牌手,在屏幕上显示每位牌手的牌. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后, ...

  3. python交互界面实例_Python面向对象编程扑克牌发牌程序,另含大量Python代码!

    1. 题目 编写程序, 4名牌手打牌,计算机随机将52张牌(不含大小鬼)发给4名牌手,在屏幕上显示每位牌手的牌. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后, ...

  4. 简单记录下几家公司的面试经历(Java一年经验)

    一年经验,记录下最近几家公司的面试经历. 1.深圳缇铭科技有限公司 1)先让自我介绍,讲一下最近的项目 根据项目提问,比如: redis你是如何部署的?你的code是直接套用他们的模板去编写,还是自己 ...

  5. 深度学习小白装机-记录一下

    深度学习小白装机-记录一下 三个备选清单. 原本早就有攒一部机器的想法,最近刚刚好在玩深度学习的小案例,所以产生了装一部自己的台式机的想法. 下面均是自己查资料所得,可能与实际有差入.出错了,我也不负 ...

  6. 面向对象发牌程序python_Python面向对象编程扑克牌发牌程序,另含大量Python代码!...

    Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 > 1. 题目 编写程序, 4名牌手打牌,计算机随机将52张牌(不含大小 ...

  7. 记录下 QT Linux 静态编译遇到的坑

    记录下 QT Linux 静态编译遇到的坑 记录下 QT Linux 静态编译遇到的坑 - 貘吃馍的日志 - 网易博客 http://qbaok.blog.163.com/blog/static/10 ...

  8. C++扑克牌发牌游戏程序(包括C++随机数的解释)

    C++产生随机数 1.C++中没有自带的random函数,要实现随机数的生成就需要使用rand()和srand(). 2.函数rand()是真正的随机数生成器,而srand()会设置供rand()使用 ...

  9. fiddler https 您的连接不是私密连接 解决方法(不明原理但是照着做成功了,记录下)

    fiddler https 您的连接不是私密连接 解决方法(不明原理但是照着做成功了,记录下) 参考文章: (1)fiddler https 您的连接不是私密连接 解决方法(不明原理但是照着做成功了, ...

  10. NetFlow是一种数据交换方式,提供网络流量的会话级视图,记录下每个TCP/IP事务的信息...

    NetFlow是一种数据交换方式,提供网络流量的会话级视图,记录下每个TCP/IP事务的信息.也许它不能象tcpdump那样提供网络流量的完整记录,但是当汇集起来时,它更加易于管理和易读.Netflo ...

最新文章

  1. nacos 环境切换_Nacos多环境配置
  2. 【HDU - 5900】QSC and Master(区间dp)
  3. 评论:北京“网店新规”将死在问题中
  4. 不仅有骁龙8 Plus!摩托罗拉新旗舰还要抢首发2亿像素
  5. 微型计算机3c认证元器件清单,3C认证产品目录.pdf
  6. 人工智能导论——智能计算(进化算法+群智能优化)
  7. Java Swing中的下拉式菜单(menu)、弹出式菜单(JPopupMenu)、选项卡窗体(JTabbedPane),TextArea右键菜单 组件使用案例
  8. 计算机基础及photoshop应用试题,计算机基础及Photoshop应用选择题(计算机一级B考试卷).doc...
  9. 又一位程序员要去IPO敲钟:40岁,知乎老板做出200亿
  10. RE2:Simple and Effective Text Matching with Richer Alignment Features
  11. [整理]svn commit obstructed
  12. JS 截取身份证号码中 的生日
  13. AOSP中make clean与make clobber的区别
  14. POJ 3278 Catch That Cow java 二分法 加 组合算法
  15. 我的EeePC 700,你快回来啊
  16. mysql 时间 本周 本月_日本人脑洞最大的奇葩恋爱游戏,本周上架Steam,别在吃饭时玩...
  17. 状态模式(State)-七十二变
  18. linux手动连接网络打印机驱动_怎么在Linux上安装打印机驱动
  19. 团体程序设计天梯赛练习题-持续更新中
  20. 绿色简约校园招聘会PPT模板

热门文章

  1. Valve在Game Dev Conference上,OUYA上的1000场比赛等等
  2. 实验吧CTF天网管理系统
  3. cocos 躲避球游戏(3) --群组碰撞
  4. codewars题目
  5. Python爬取王者荣耀全皮肤台词语音
  6. 机智云(esp8266)与74hc595控制16路继电器
  7. matlab randn 范围,matlab randn 范围
  8. python中rand和randn_Numpy中np.random.rand()和np.random.randn() 用法和区别详解
  9. 计算机应用程序是啥意思,为什么某些Mac应用程序需要“使用辅助功能控制此计算机?...
  10. 如何强制关闭mac后台程序