Java多线程经典题目(医院挂号)
题目
实现一个医院的挂号机系统,要求:有多台挂号机同时运行,此时无论有多少患者挂号,要求都能挂到不同
的号码,并且要求实现当意外断电之后,下一次恢复还能从上次结束号码继续挂号?
* synchronized
* 文件操作
* IO流
解题思路
此题的难点在于这个断电,首先java处理断电续传等问题,一般我们使用RandomAccessFile这个流,因为它里面有个seek方法,可以设置
光标的偏移量,可以从超大的文本中快速定位我们的游标。所以我们可以将已经挂的号存到一个新文件,然后每个
线程执行挂号的时候都读取新文件的length长度作为seet的偏移量,以此来达到断电之后也能从上次结束号码继
续挂号。
源代码如下:
package com.thospital;
/**
* User:zhang
* Date:2020/11/10
**/
import java.io.*;
public class TestHospital {
public static void putNum(File file) {
try {
DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
for (int i = 1; i < 10001; i++) {
dos.writeInt(i);
}
dos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
RandomAccessFile r=new RandomAccessFile("d:\\a.txt","r");
// 下面不能用randomAccessFile,因为它是覆盖写,并且到达上次长度才能改变它的长度
DataOutputStream w = new DataOutputStream(new FileOutputStream("d:\\b.txt",true));
IOThread ioThread = new IOThread(r,w);
Thread thread1 = new Thread(ioThread, "挂号机一号");
Thread thread2 = new Thread(ioThread, "挂号机二号");
Thread thread3 = new Thread(ioThread, "挂号机三号");
Thread thread4 = new Thread(ioThread, "挂号机四号");
thread1.start();
thread2.start();
thread3.start();
thread4.start();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
class IOThread implements Runnable {
private RandomAccessFile ra=null;
private DataOutputStream wr=null;
private File file=new File("d:\\b.txt");
public IOThread(RandomAccessFile r, DataOutputStream w) {
this.ra = r;
this.wr = w;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
while (true){
System.out.println("患者在" + name + "挂到了" + getNum() + "号");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized int getNum() {
try {
Thread.sleep(1000);
// 判断文件的长度就用文件的length
ra.seek(file.length());
int i = ra.readInt();
wr.writeInt(i);
if (i != -1) {
return i;
}else {
return -1;
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return 0;
}
}
```java
Java多线程经典题目(医院挂号)的更多相关文章
- JAVA多线程经典问题 -- 生产者 消费者
工作2年多来一直也没有计划写自己的技术博客,最近辞职在家翻看<thingking in JAVA>,偶尔看到了生产者与消费者的一个经典的多线程同步问题.本人在工作中很少使用到多线程以及高并 ...
- Java面试经典题目合集
32 1.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? “static”关键字表明一个成员变量或者是成员方法与类相关,可以在 ...
- Oracle Certified Java Programmer 经典题目分析(一)
Given: 1. public class returnIt { 2. returnType methodA(byte x, double y){ 3. return (short) x/y * 2 ...
- Java多线程经典案例分享
汇总 案例一 案例二 案例三 案例四 案例五 案例六 案例七 案例一 实现一个容器,提供两个方法,add(),count() 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数 ...
- JAVA多线程经典问题 -- 生产者 消费者 同步队列实现方法
在JAVASE5 中的java.util.concurrent.BlockingQueue支持,BlockingQueue是一个接口但是我们通常可以使用LinkedBlockingQueue,它是一个 ...
- Oracle Certified Java Programmer 经典题目分析(二)
...接上篇 what is reserved(保留) words in java? A. run B. default C. implement D. import Java 关键字列表 (依字母排 ...
- JAVA多线程面试题目
1,java中有几种方法可以实现一个线程? 答:在Java中实现一个线程有两种方法,第一是实现Runnable接口实现它的run()方法,第二种是继承Thread类,覆盖它的run()方法.这两种方法 ...
- Java多线程中的wait/notify通信模式
前言 最近在看一些JUC下的源码,更加意识到想要学好Java多线程,基础是关键,比如想要学好ReentranLock源码,就得掌握好AQS源码,而AQS源码中又有很多Java多线程经典的一些应用:再比 ...
- 40道经典java多线程面试题
40道经典java多线程面试题 题目来源 看完了java并发编程的艺术,自认为多线程"大成",然后找了一些面试题,也发现了一些不足. 一下问题来源于网上的博客,答案均为本人个人见解 ...
随机推荐
- rxjs入门7之其它操作符复习
一.辅助类操作符 二.过滤数据流 三.转化数据流 四.异常错误处理 五.多播 ,Subject类型
- js 为什么0.1+0.2不等于0.3
当程序员在使用浮点数进行计算逻辑处理时,不注意,就可能出现问题, 记住,永远不要直接比较俩个浮点的大小 这个属于数字运算中的精度缺失的问题 在0.1 + 0.2这个式子中,0.1和0.2都是近似表示的 ...
- rs232转以太网
rs232转以太网 rs232转以太网ZLAN5103可以实现RS232/485/422和TCP/IP之间进行透明数据转发.方便地使得串口设备连接到以太网和Internet,实现串口设备的网络化升级. ...
- C#使用RabbitMq队列(Sample,Work,Fanout,Direct等模式的简单使用)
1:RabbitMQ是个啥?(专业术语参考自网络) RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件). RabbitMQ服务器是用Erlang语言编写的, ...
- jdk、eclipse和idea安装
一.jdk下载与环境配置与IDEA 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213315 ...
- 第一章 数据库管理员(DBA)
一.DBA的工作 1.初级:mysql基础安装.搭建 2.中级:数据库管理员DBA 1)用户管理 1.用户的权限2.用户可以操作的库或者表3.用户名和来源的主机4.用户的密码grant all on ...
- node服务器基本搭建
const http = require('http') // 引入http模块 http.createServer(function(req,res){ // 创建一个http服务器 // 这里是一 ...
- Redis基础——剖析基础数据结构及其用法
这是一个系列的文章,打算把Redis的基础数据结构.高级数据结构.持久化的方式以及高可用的方式都讲一遍,公众号会比其他的平台提前更新,感兴趣的可以提前关注,「SH的全栈笔记」,下面开始正文. 如果你是 ...
- 经典剪枝算法的例题——Sticks详细注释版
这题听说是道十分经典的剪枝算的题目,不要问我剪枝是什么,我也不知道,反正我只知道用到了深度搜索 我参考了好多资料才悟懂,然后我发现网上的那些大神原理讲的很明白,但代码没多少注释,看的很懵X,于是我抄起 ...
- 笔记本电脑插网线能上网,但是连不上WIFI,或者连上WiFi显示无internet,怎么解决?
1.鼠标 右键 "此电脑",选择"属性"