java 多线程 银行排队_3.采用多线程模拟银行排队叫号
# 采用多线程模拟排队叫号
关于排队叫号想必大家都了解:比如去银行,都会有取号机,银行窗口每办理完一个业务都会叫下一个排队的号去处理业务,一个人不会被多个窗口同时叫号,所以这里也涉及到了一个多线程共享数据的问题:我们先用代码简单模拟一下流程:
```java
/**
* @program: ThreadDemo
* @description: 模拟柜台
* @author: hs96.cn@Gmail.com
* @create: 2020-08-27
*/
public class Bank {
public static void main(String[] args) {
TicketWindowOneThread ticketWindowOneThread = new TicketWindowOneThread("一号柜台");
ticketWindowOneThread.start();
}
}
```
```java
/**
* @program: ThreadDemo
* @description: 模拟银行窗口处理业务
* @author: hs96.cn@Gmail.com
* @create: 2020-08-27
*/
public class TicketWindowOneThread extends Thread{
private final String name;
private static final int MAX = 50;
private int index = 1;
public TicketWindowOneThread(String name) {
this.name = name;
}
@Override
public void run() {
// 当当前号码数小于最大号码时,进行售票操作
while (index <= MAX) {
System.out.println("柜台:" + name + ",当前的号码是:" + (index++));
}
}
}
```
运行效果如下:
![](https://img.kancloud.cn/01/58/0158128f121ec4c5f2be4b7fb6231ff0_1040x224.gif)
这个输出毫无疑问,目前是单线程动作,接下来模拟三个窗口来模拟下真实的银行处理过程:
```java
/**
* @program: ThreadDemo
* @description: 模拟柜台叫号
* @author: hs96.cn@Gmail.com
* @create: 2020-08-27
*/
public class Bank {
public static void main(String[] args) {
TicketWindowOneThread ticketWindowOneThread1 = new TicketWindowOneThread("一号柜台");
ticketWindowOneThread1.start();
TicketWindowOneThread ticketWindowOneThread2 = new TicketWindowOneThread("二号柜台");
ticketWindowOneThread2.start();
TicketWindowOneThread ticketWindowOneThread3 = new TicketWindowOneThread("三号柜台");
ticketWindowOneThread3.start();
}
}
```
运行结果如下:
![](https://img.kancloud.cn/98/96/9896e56d42257e8e8946b69dc7575165_541x282.png)
这时候每个柜台都按照自己的号来叫,也就是窗口的index没有在线程之间同步,那么如何解决呢?
其实也很简单:只要用static修饰一下就好了:
![](https://img.kancloud.cn/a2/9f/a29f9bf13a988cec6730d45927f8795c_744x452.png)
运行效果如下:
![](https://img.kancloud.cn/89/c8/89c8960e6d9c168134e47b795077f1bf_1153x382.gif)
可以看到三个线程已经实现共享`TicketWindowOneThread`的`index`了。但是可以看到输出的顺序颠倒了,这个我们后续再优化,先理解这个线程共享资源的概念即可。
java 多线程 银行排队_3.采用多线程模拟银行排队叫号相关推荐
- java模拟银行存取_JAVA基础案例 模拟银行存取款业务
模拟银行存取款业务 编写一个Java应用程序,模拟网上银行登录及存取款业务.登录时需判断银行卡号和银行卡密码,当输入的卡号和密码都正确时,登录成功,提示当前登录的账户名,并进入下一步选择操作类型.操作 ...
- 多线程三种同步方式(模拟银行取款)
方法一:同步代码块 Accoun package com.bjsxt.synch1;/*** 银行账户类*/ public class Account {private int balance = 6 ...
- java模拟银行账户业务转账_模拟银行账户汇款操作(并发控制)
import java.util.Arrays; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Tim ...
- c语言模拟银行ATM的程序,简单模拟银行ATM取款系统 | C/C++程序员之家
学习C#,第一次C#实验课,模拟ATM取款系统,锻炼基本的C#语法以及选择控制语句! 实现功能: 1.取款 2.余额查询 3.修改密码 4.退出 [cpp] using System; using S ...
- Python基础项目实践之:面向对象方法实现模拟银行管理系统
Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...
- Java 多线程 模拟银行ATM实时存取钱
近期想回顾一些知识: 一.Java 多线程 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.多线程是多任务的一种特别的形式,但多线程使用了更小的资源开 ...
- java银行排队系统_用GUI模拟银行排队系统
要求: 和实际情况相似,您到银行办理业务,到了银行大厅首先是在电脑上刷卡(有的可能不用刷卡)取出一个纸条,上面有你的位置号还有你前面有多少人,在工作人员那里会有一个按钮,点击一下就会叫一个人到他那里办 ...
- java如何写线程外部类_廖雪峰Java读书笔记(六)--多线程(或称并发)
1. 多线程基础 首先要明白一些概念: 进程:把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程. 线程:某些进程内部还需要同时执行多个子任务.例 ...
- Java的并发编程中的多线程问题到底是怎么回事儿?
转载自 Java的并发编程中的多线程问题到底是怎么回事儿? 在我之前的一篇<再有人问你Java内存模型是什么,就把这篇文章发给他.>文章中,介绍了Java内存模型,通过这篇文章,大家应 ...
- Java第二十八天——杂七杂八的流 多线程
Java第二十八天--杂七杂八的流 多线程 一.杂七杂八的流 1._序列化流和反序列化流的概述和使用(理解) A:序列化流的概述 所谓的序列化:就是把对象通过流的方式存储到文件中.注意:此对象 要 ...
最新文章
- C++格式化输入输出
- java中float和double型数据在赋值时有哪些注意事项?,java语言中float和double类型的数据在编程时的注意事项...
- 3.1.6 OS之分页存储(页号、页偏移量等)
- Qmail 邮件系统维护管理技术文档
- filters.revealTrans.Transition用法
- php 音频上传大小限制,WordPress最大上传文件大小限制修改 | Stay Curious
- Android TV开发总结(七)构建一个TV app中的剧集列表控件
- K-Lite Codec Pack 解码器下载及安装过程步骤参考
- ssh远程连接网络构建
- Java 编程语言单词汇总
- 天涯.只看楼主的bookmarklet
- 英语常用口语1000句
- MQTT-Eclipse paho mqtt源码分析-连接MQTT Broker
- 意大利或将立法 禁止中小学校园携带手机
- 使用 apifm 插件进行 Flutter 云开发——QQ一键登录/注册
- LeetCode Daily challenge - K Closest Points to Origin
- python画厢式图_用matplotlib画箱体图(boxplot)
- 手写tomcat socket closed_ipad pencil2019防误触电容笔苹果air3触屏控手写笔mini5绘画202010元优惠券券后价65元...
- Python 构成三角形
- 前端之HTML 表格