三个售票窗口同时出售20张票。

简单实现:

package com.example.demo.service;import java.util.concurrent.*;public class SellTicket extends Thread{//为了保持票数一致,票要静态static int tick = 20;//创建一个静态钥匙static Object ob = "aa";public SellTicket(String name){super(name);}/*重写run方法,实现买票操作*/@Overridepublic void run(){System.out.println(getName()+"开始售票");while (tick > 0) {synchronized (ob) {//使用这个锁保持一致性if (tick > 0) {System.out.println(getName() + "卖出了第" + tick + "张票");tick--;} else {System.out.println("票卖完了!");}}try {sleep(1000);//休息一秒} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {/*实例化三个站台对象,并为每一个对象取名*/SellTicket sellTicket = new SellTicket("窗口一");SellTicket sellTicket1 = new SellTicket("窗口二");SellTicket sellTicket2 = new SellTicket("窗口三");/*让三个站台开始工作*/sellTicket.start();sellTicket1.start();sellTicket2.start();}}

这样可以在简单地实现在单体应用下的数据一致性(加锁),但是程序存在很多问题,线程不能复用,新建和销毁开销大,负载均衡下会产生数据问题等。

注意,不能使用JUnit测试,因为JUnit不支持多线程。

通过定长线程池改造一下(引入线程四作为比较):

package com.example.demo.service;import java.util.concurrent.*;public class SellTicket extends Thread{//为了保持票数一致,票要静态static int tick = 20;//创建一个静态钥匙static Object ob = "aa";public SellTicket(String name){super(name);}/*重写run方法,实现买票操作*/@Overridepublic void run(){System.out.println(getName()+"开始售票");while (tick > 0) {synchronized (ob) {//使用这个锁保持一致性if (tick > 0) {System.out.println(getName() + "卖出了第" + tick + "张票");tick--;} else {System.out.println("票卖完了!");}}try {sleep(1000);//休息一秒} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {//线程池改造ExecutorService executor = Executors.newFixedThreadPool(3);/*实例化三个站台对象,并为每一个对象取名*/SellTicket sellTicket = new SellTicket("窗口一");SellTicket sellTicket1 = new SellTicket("窗口二");SellTicket sellTicket2 = new SellTicket("窗口三");SellTicket sellTicket3 = new SellTicket("窗口四");executor.execute(sellTicket);executor.execute(sellTicket1);executor.execute(sellTicket2);executor.execute(sellTicket3);//窗口四在队列中等待,不能执行executor.shutdown();//线程池不能自动关闭,需要手动shutdown}}

结果如下:

窗口三开始售票
窗口一开始售票
窗口三卖出了第20张票
窗口二开始售票
窗口二卖出了第19张票
窗口一卖出了第18张票
窗口二卖出了第17张票
窗口三卖出了第16张票
窗口一卖出了第15张票
窗口二卖出了第14张票
窗口一卖出了第13张票
窗口三卖出了第12张票
窗口二卖出了第11张票
窗口三卖出了第10张票
窗口一卖出了第9张票
窗口三卖出了第8张票
窗口一卖出了第7张票
窗口二卖出了第6张票
窗口一卖出了第5张票
窗口二卖出了第4张票
窗口三卖出了第3张票
窗口一卖出了第2张票
窗口三卖出了第1张票
票卖完了!
窗口四开始售票

多线程实例之售卖车票相关推荐

  1. OpenGL多线程实例

    OpenGL多线程实例 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include "tinycthread.h" #include &l ...

  2. Java Tread多线程(0)一个简单的多线程实例

    作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多 ...

  3. python3线程gil_python3爬虫GIL修改多线程实例讲解

    我们打开程序后,会发现电脑的内存和cpu发生了变化.在对于前者上面,自然是希望内容占用小,cpu的利用越高越好.那有没有什么方法可以让我们的cpu达到满状态的运行效果呢?这就得用到我们所学的多线程中的 ...

  4. 在BCB中使用多线程实例

    在BCB中使用多线程实例 C++Builder 下的多线程介绍 转载于:https://www.cnblogs.com/LittleTiger/p/5537497.html

  5. Qt5.9一个简单的多线程实例(类QThread)(第一种方法)

    Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...

  6. 【C语言】C语言多线程实例之pthread的应用

    [C语言]C语言多线程实例之pthread的应用 Pthread是由POSIX提出的一套通用的线程库,在linux平台下,它被广泛的支持,而windows平台下,却并不被支持,而pthreads-w3 ...

  7. Android客户端多线程实例分析

    Java中实现多线程主要有两种方式:继承Thread类.实现Runnable接口. Thread类存放于java.lang类库中,系统默认加载这个包,所以可以直接使用Thread类. class my ...

  8. Kafka Consumer多线程实例

    Kafka 0.9版本开始推出了Java版本的consumer,优化了coordinator的设计以及摆脱了对zookeeper的依赖.社区最近也在探讨正式用这套consumer API替换Scala ...

  9. C++多线程实例(_beginThreadex创建多线程)

    C++多线程(二)(_beginThreadex创建多线程) C/C++ Runtime 多线程函数 一 简单实例(来自codeprojct:http://www.codeproject.com/us ...

最新文章

  1. 【转】超简单利用UGUI制作圆形小地图
  2. 图书借阅系统java_基于JAVAWEB的图书借阅系统
  3. 敏捷团队中的QA由来
  4. java.util.concurrent 包下面的所有类
  5. MIT Scheme 使用 Edwin
  6. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第26篇]描述NAF标量乘法算法
  7. html分类代码查询,html标签元素分类(示例代码)
  8. RedAlert简介
  9. JAVA-求整数序列中出现次数最多的数
  10. 安卓案例:基于HttpClient下载文本与图片
  11. 标准模板库(STL) map —— 初始化问题
  12. Java 将鼠标改为图片的两种方法
  13. Docker 下载安装使用(简单教程)
  14. VC++LNK2005错误:already defined in *.obj
  15. 华盛顿州法律确定区块链记录具有法律效力和可执行性
  16. 史上最全Java开发手册!!!阿里出版
  17. IDEA Java 死锁
  18. 京东快递开接外单偏平台商户
  19. LSTM 两个激励函数区别sigmoid 和tanh
  20. 数据结构实战-死磕王争

热门文章

  1. 在线升级R语言版本以及在RStudio容纳最新版本的R
  2. 使用zepto.js完成的手机相册
  3. ASP.NET Core 正确获取查询字符串参数
  4. qt程序异常结束crashed
  5. 智慧工地施工如何应用室内定位uwb技术
  6. GeoPandas入门 | 05-Python可视化空间数据
  7. Flutter 必须知道的布局规则
  8. Mac最佳视频编辑器推荐
  9. 那些年我们追过的C#奇葩关键字——忐忑
  10. [机器视觉]gocv图像水平投影和垂直投影