题目:某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有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个员工进出哪个入口,因为是员工进入了入口,入口才相应彩票方法,所以我用了等待唤醒机制(这里要注意,这个等待唤醒机制必须要在同步块中,还要用同一把锁。)
 
代码:

class Paper implements Runnable {

    boolean bFlag = false;

    private int id;

    public void setId(int id) {

        this.id = id;
} public int getId() {
return this.id;
} public String position; private List<String> listPosCount = new ArrayList<String>(); private HashMap<Integer, int[]> dic = new HashMap<Integer, int[]>(); private List<Integer> myList = new ArrayList<Integer>(); private int[] getNumbers(int size) { int numbers[] = new int[size]; for (int i = 0; i < size;) { boolean flag = false; numbers[i] = (int) (Math.random() * 100); for (int j = 0; j < i; j++) { if (numbers[j] == numbers[i]) { flag = true; break; }
} if (flag == true) { continue;
} i++;
}
return numbers;
} @Override
public void run() {
synchronized (this) {
while (myList.size() < 100) { while (!bFlag) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace();
}
} this.bFlag = false; if (!myList.contains(id)) { myList.add(id);
if (position == "qian门" || position == "后门")
listPosCount.add(position); int nums[] = getNumbers(7); dic.put(id, nums); System.out
.println("编号为: " + id + " 的员工 从" + position + " 入场! 拿到的双色球彩票号码是:" + Arrays.toString(nums)); } else { }
this.notifyAll();
} int a = 0, b = 0;
for (String str : listPosCount) { if (str == "后门")
a++;
if (str == "qian门")
b++; }
System.out.println("从后门入场的员工总共:" + a + " 位员工");
System.out.println("从后门入场的员工总共:" + b + " 位员工"); }
}
}
//--------------------------------------------------------------------------------
//测试main函数
public class ThreadLearn2 {

	public static void main(String[] args) {

		Paper p = new Paper();

		Thread th1 = new Thread(p);
Thread th2 = new Thread(p); Runnable run1 = new Runnable() { @Override
public void run() {
synchronized (p) { List<Integer> list = new ArrayList<Integer>(); while (list.size() < 100) {
int i = (int) (Math.random() * 100); if (list.indexOf(i) == -1) { p.setId(i); list.add(i); p.bFlag = true; int num = (int) (Math.random() * 100) % 2; if (num == 1) { p.position = "后门";
} else {
p.position = "qian门"; }
p.notifyAll(); while (p.bFlag) { try { p.wait(); } catch (InterruptedException e) { e.printStackTrace();
}
} } } }
} }; Thread th3 = new Thread(run1); th1.start();
th2.start();
th3.start(); } }

  

 
 

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. [转]Android ImageView的scaleType属性与adjustViewBounds属性

    Android ImageView的scaleType属性与adjustViewBounds属性   ImageView的scaleType的属性有好几种,分别是matrix(默认).center.c ...

  2. JAVA 泛型中的通配符 T,E,K,V,?

    前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据 ...

  3. python控制窗口口字形运动

    import win32con import win32gui import time import math notepad = win32gui.FindWindow("Photo_Li ...

  4. hdu6219 Empty Convex Polygons (最大空凸包板子

    https://vjudge.net/contest/324256#problem/L 题意:给一堆点,求最大空凸包面积. 思路:枚举凸包左下角点O,dp找出以这个点为起始位置能构成的最大空凸包面积, ...

  5. HDU4614Vases and Flowers 二分+线段树;

    参考:https://blog.csdn.net/ophunter_lcm/article/details/9879495   题意: 有n个花瓶,有两种操作,1.从a开始放b朵花,有花的花瓶跳过,2 ...

  6. JOBDU 1027 欧拉回路

    题目1027:欧拉回路 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3620 解决:1847 题目描述:     欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条 ...

  7. NOIP 2009 最优贸易 题解

    一道最短路的题,找一个买入和卖出相差最高的点即可,我们先以1为起点跑spfa,d1[x]不再表示距离而表示能够经过权值最小的节点的权值即 if(d1[y]>min(d1[x],price[y]) ...

  8. 移动端适配,h5网页,手机端适配兼容方案.可以显示真实的1px边框和12px字体大小,dpr浅析

    以前写移动端都是用这段JS解决. (function (doc, win) { // 分辨率Resolution适配 var docEl = doc.documentElement, resizeEv ...

  9. 那些年,我们误解的 JavaScript 闭包

    说到闭包,大部分的初始者,都是谈虎色变的.最近对闭包,有了自己的理解,就感觉.其实我们误解闭包.也被网上各种说的闭包的解释给搞迷糊. 一句话:要想理解一个东西还是看权威的东西. 下面我来通俗的讲解一个 ...

  10. 深入拆解Java虚拟机视频教程

    目录: 第1节说在前面的话   00:05:07分钟   | 第3节环境搭建以及jdk,jre,jvm的关系   00:20:48分钟   | 第5节jvm再体验-jvm可视化监控工具   00:21 ...