题目:某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程,
并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码。线程运行后打印格式如下:
编号为: 2 的员工 从后门 入场! 拿到的双色球彩票号码是: [17, 24, 29, 30, 31, 32, 07]
编号为: 1 的员工 从后门 入场! 拿到的双色球彩票号码是: [06, 11, 14, 22, 29, 32, 15]
//.....
从后门入场的员工总共: 13 位员工
从前门入场的员工总共: 87 位员工
 
分析:两个入口对应两个线程,获取彩票的方法覆写Runnable接口的run方法实现,我把这个实现了Runnable接口的类称作Paper类,里面用id字段记录员工编号,并提供get,set方法。设置第3个线程来作为随机控制100个员工进出哪个入口,因为是员工进入了入口,入口才相应彩票方法,所以我用了等待唤醒机制(这里要注意,这个等待唤醒机制必须要在同步块中,还要用同一把锁。)
 
代码:

  1. class Paper implements Runnable {
  2.  
  3. boolean bFlag = false;
  4.  
  5. private int id;
  6.  
  7. public void setId(int id) {
  8.  
  9. this.id = id;
  10. }
  11.  
  12. public int getId() {
  13. return this.id;
  14. }
  15.  
  16. public String position;
  17.  
  18. private List<String> listPosCount = new ArrayList<String>();
  19.  
  20. private HashMap<Integer, int[]> dic = new HashMap<Integer, int[]>();
  21.  
  22. private List<Integer> myList = new ArrayList<Integer>();
  23.  
  24. private int[] getNumbers(int size) {
  25.  
  26. int numbers[] = new int[size];
  27.  
  28. for (int i = 0; i < size;) {
  29.  
  30. boolean flag = false;
  31.  
  32. numbers[i] = (int) (Math.random() * 100);
  33.  
  34. for (int j = 0; j < i; j++) {
  35.  
  36. if (numbers[j] == numbers[i]) {
  37.  
  38. flag = true;
  39.  
  40. break;
  41.  
  42. }
  43. }
  44.  
  45. if (flag == true) {
  46.  
  47. continue;
  48. }
  49.  
  50. i++;
  51. }
  52. return numbers;
  53. }
  54.  
  55. @Override
  56. public void run() {
  57. synchronized (this) {
  58. while (myList.size() < 100) {
  59.  
  60. while (!bFlag) {
  61.  
  62. try {
  63.  
  64. this.wait();
  65.  
  66. } catch (InterruptedException e) {
  67.  
  68. e.printStackTrace();
  69. }
  70. }
  71.  
  72. this.bFlag = false;
  73.  
  74. if (!myList.contains(id)) {
  75.  
  76. myList.add(id);
  77. if (position == "qian门" || position == "后门")
  78. listPosCount.add(position);
  79.  
  80. int nums[] = getNumbers(7);
  81.  
  82. dic.put(id, nums);
  83.  
  84. System.out
  85. .println("编号为: " + id + " 的员工 从" + position + " 入场! 拿到的双色球彩票号码是:" + Arrays.toString(nums));
  86.  
  87. } else {
  88.  
  89. }
  90. this.notifyAll();
  91. }
  92.  
  93. int a = 0, b = 0;
  94. for (String str : listPosCount) {
  95.  
  96. if (str == "后门")
  97. a++;
  98. if (str == "qian门")
  99. b++;
  100.  
  101. }
  102. System.out.println("从后门入场的员工总共:" + a + " 位员工");
  103. System.out.println("从后门入场的员工总共:" + b + " 位员工");
  104.  
  105. }
  106. }
  107. }
//--------------------------------------------------------------------------------
//测试main函数
  1. public class ThreadLearn2 {
  2.  
  3. public static void main(String[] args) {
  4.  
  5. Paper p = new Paper();
  6.  
  7. Thread th1 = new Thread(p);
  8. Thread th2 = new Thread(p);
  9.  
  10. Runnable run1 = new Runnable() {
  11.  
  12. @Override
  13. public void run() {
  14. synchronized (p) {
  15.  
  16. List<Integer> list = new ArrayList<Integer>();
  17.  
  18. while (list.size() < 100) {
  19. int i = (int) (Math.random() * 100);
  20.  
  21. if (list.indexOf(i) == -1) {
  22.  
  23. p.setId(i);
  24.  
  25. list.add(i);
  26.  
  27. p.bFlag = true;
  28.  
  29. int num = (int) (Math.random() * 100) % 2;
  30.  
  31. if (num == 1) {
  32.  
  33. p.position = "后门";
  34. } else {
  35. p.position = "qian门";
  36.  
  37. }
  38. p.notifyAll();
  39.  
  40. while (p.bFlag) {
  41.  
  42. try {
  43.  
  44. p.wait();
  45.  
  46. } catch (InterruptedException e) {
  47.  
  48. e.printStackTrace();
  49. }
  50. }
  51.  
  52. }
  53.  
  54. }
  55.  
  56. }
  57. }
  58.  
  59. };
  60.  
  61. Thread th3 = new Thread(run1);
  62.  
  63. th1.start();
  64. th2.start();
  65. th3.start();
  66.  
  67. }
  68.  
  69. }

  

 
 

Java 多线程练习的更多相关文章

  1. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  2. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...

  3. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  4. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  5. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  6. Java多线程 2 线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  7. java 多线程 1 线程 进程

    Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报  分类: javaSE综合知识点(14)  版权声明:本文为博主原创文章,未经博 ...

  8. 一起阅读《Java多线程编程核心技术》

    目录 第一章 Java多线程技能 (待续...)

  9. 第一章 Java多线程技能

    1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...

  10. java从基础知识(十)java多线程(下)

    首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...

随机推荐

  1. Git 上传本地项目到Github

    前提: 安装Git 注册并拥有Github账号 目录: 初始化本地目录位Git仓库 Github上创建仓库 本地生成SSH key,并添加到Github上 本地项目管理Github上远程项目 详细步骤 ...

  2. Python从入门到精通之环境搭建

    本章内容: Windows系统环境搭建 Linux系统环境搭建 Mac OS系统环境搭建 一.下载python安装包 下载地址:https://www.python.org/downloads/ 二. ...

  3. 【Bazinga HDU - 5510 】【考察strstr()的使用】【贪心】

    题意分析 1.题目大致说的是让你输出符合这种条件(在所给的字符串中至少有一个不是它的子串)的字符串对应的label,若没有输出-1: 2.判断子串可以用string.h下的strstr(s1, s2) ...

  4. Keras(七)Keras.layers各种层介绍

    一.网络层 keras的层主要包括: 常用层(Core).卷积层(Convolutional).池化层(Pooling).局部连接层.递归层(Recurrent).嵌入层( Embedding).高级 ...

  5. JMeter简介及使用JMeter来访问网站

    参考: http://jmeter.apache.org/ http://blog.chinaunix.net/uid-26884465-id-3416869.html http://www.ltes ...

  6. [python]通过微信公众号“Python程序员”,编写python代码

    今天发现微信公众号中,居然可以编写python代码,很是惊喜,觉得蛮有趣的. 步骤如下: 1.关注微信公众号“Python程序员” 2.关注成功后,点击右下角的“潘多拉”->"Pyth ...

  7. POJ 1077 Eight (BFS+康托展开)详解

    本题知识点和基本代码来自<算法竞赛 入门到进阶>(作者:罗勇军 郭卫斌) 如有问题欢迎巨巨们提出 题意:八数码问题是在一个3*3的棋盘上放置编号为1~8的方块,其中有一块为控制,与空格相邻 ...

  8. 【Redis】基础学习概览【汇总】

    一.概述 1.1 简介 1.2 Redis单线程好处 1.3 单线程弊端 1.4 Redis应用场景 二.安装.开启以及关闭 三.Redis基本数据类型 四.SpringBoot整合Redis 五.R ...

  9. HTTPS页面使用CNZZ统计代码,Chrome显示警告怎么办?

    很多站长会遇到一个问题,网站加入CNZZ的JS统计代码后,Chrome浏览器出现警告:阻止跨站解析器阻断脚本通过document.write调用(A parser-blocking, cross si ...

  10. ajax交互案例

    数据交互是前端很重要的一部分,静态页是基础,而交互才是网页的精髓.交互又分为人机交互和前后端数据交互,现阶段的互联网下,大部分的网站都要进行前后端数据交互,如何交互呢?交互的流程大概就是前端发送数据给 ...