多线程实例之售卖车票
三个售票窗口同时出售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张票
票卖完了!
窗口四开始售票
多线程实例之售卖车票相关推荐
- OpenGL多线程实例
OpenGL多线程实例 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include "tinycthread.h" #include &l ...
- Java Tread多线程(0)一个简单的多线程实例
作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多 ...
- python3线程gil_python3爬虫GIL修改多线程实例讲解
我们打开程序后,会发现电脑的内存和cpu发生了变化.在对于前者上面,自然是希望内容占用小,cpu的利用越高越好.那有没有什么方法可以让我们的cpu达到满状态的运行效果呢?这就得用到我们所学的多线程中的 ...
- 在BCB中使用多线程实例
在BCB中使用多线程实例 C++Builder 下的多线程介绍 转载于:https://www.cnblogs.com/LittleTiger/p/5537497.html
- Qt5.9一个简单的多线程实例(类QThread)(第一种方法)
Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...
- 【C语言】C语言多线程实例之pthread的应用
[C语言]C语言多线程实例之pthread的应用 Pthread是由POSIX提出的一套通用的线程库,在linux平台下,它被广泛的支持,而windows平台下,却并不被支持,而pthreads-w3 ...
- Android客户端多线程实例分析
Java中实现多线程主要有两种方式:继承Thread类.实现Runnable接口. Thread类存放于java.lang类库中,系统默认加载这个包,所以可以直接使用Thread类. class my ...
- Kafka Consumer多线程实例
Kafka 0.9版本开始推出了Java版本的consumer,优化了coordinator的设计以及摆脱了对zookeeper的依赖.社区最近也在探讨正式用这套consumer API替换Scala ...
- C++多线程实例(_beginThreadex创建多线程)
C++多线程(二)(_beginThreadex创建多线程) C/C++ Runtime 多线程函数 一 简单实例(来自codeprojct:http://www.codeproject.com/us ...
最新文章
- 【转】超简单利用UGUI制作圆形小地图
- 图书借阅系统java_基于JAVAWEB的图书借阅系统
- 敏捷团队中的QA由来
- java.util.concurrent 包下面的所有类
- MIT Scheme 使用 Edwin
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第26篇]描述NAF标量乘法算法
- html分类代码查询,html标签元素分类(示例代码)
- RedAlert简介
- JAVA-求整数序列中出现次数最多的数
- 安卓案例:基于HttpClient下载文本与图片
- 标准模板库(STL) map —— 初始化问题
- Java 将鼠标改为图片的两种方法
- Docker 下载安装使用(简单教程)
- VC++LNK2005错误:already defined in *.obj
- 华盛顿州法律确定区块链记录具有法律效力和可执行性
- 史上最全Java开发手册!!!阿里出版
- IDEA Java 死锁
- 京东快递开接外单偏平台商户
- LSTM 两个激励函数区别sigmoid 和tanh
- 数据结构实战-死磕王争