题目

实现一个医院的挂号机系统,要求:有多台挂号机同时运行,此时无论有多少患者挂号,要求都能挂到不同

的号码,并且要求实现当意外断电之后,下一次恢复还能从上次结束号码继续挂号?

* 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多线程经典题目(医院挂号)的更多相关文章

  1. JAVA多线程经典问题 -- 生产者 消费者

    工作2年多来一直也没有计划写自己的技术博客,最近辞职在家翻看<thingking in JAVA>,偶尔看到了生产者与消费者的一个经典的多线程同步问题.本人在工作中很少使用到多线程以及高并 ...

  2. Java面试经典题目合集

    32 1.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? “static”关键字表明一个成员变量或者是成员方法与类相关,可以在 ...

  3. Oracle Certified Java Programmer 经典题目分析(一)

    Given: 1. public class returnIt { 2. returnType methodA(byte x, double y){ 3. return (short) x/y * 2 ...

  4. Java多线程经典案例分享

    汇总 案例一 案例二 案例三 案例四 案例五 案例六 案例七 案例一 实现一个容器,提供两个方法,add(),count() 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数 ...

  5. JAVA多线程经典问题 -- 生产者 消费者 同步队列实现方法

    在JAVASE5 中的java.util.concurrent.BlockingQueue支持,BlockingQueue是一个接口但是我们通常可以使用LinkedBlockingQueue,它是一个 ...

  6. Oracle Certified Java Programmer 经典题目分析(二)

    ...接上篇 what is reserved(保留) words in java? A. run B. default C. implement D. import Java 关键字列表 (依字母排 ...

  7. JAVA多线程面试题目

    1,java中有几种方法可以实现一个线程? 答:在Java中实现一个线程有两种方法,第一是实现Runnable接口实现它的run()方法,第二种是继承Thread类,覆盖它的run()方法.这两种方法 ...

  8. Java多线程中的wait/notify通信模式

    前言 最近在看一些JUC下的源码,更加意识到想要学好Java多线程,基础是关键,比如想要学好ReentranLock源码,就得掌握好AQS源码,而AQS源码中又有很多Java多线程经典的一些应用:再比 ...

  9. 40道经典java多线程面试题

    40道经典java多线程面试题 题目来源 看完了java并发编程的艺术,自认为多线程"大成",然后找了一些面试题,也发现了一些不足. 一下问题来源于网上的博客,答案均为本人个人见解 ...

随机推荐

  1. 多测师讲解python _练习题002_高级讲师肖sir

    # 1.求出1/1+1/3+1/5--+1/99的和 # 2.用循环语句,计算2-10之间整数的循环相乘的值. # 3.用for循环打印九九乘法表 # 4.求每个字符串中字符出现的个数如:hellow ...

  2. 4-20mA模拟量采集

    4-20mA模拟量采集 4-20mA模拟量采集可选卓岚ZLAN6802(485)/ZLAN6842(以太网)/ZLAN6844(无线wifi)他们不仅可以可采集4~20mA还可以采集 /0~5V/0~ ...

  3. day26 Pyhton 复习re模块和序列化模块

    # re # 正则表达式 # 元字符 # 量词 # 贪婪匹配与惰性匹配 # 元字符量词 # 元字符量词? 在量词规范内,遇到一个x就停下来 # .*?x (.如果是第一个元素,那么它一定会从第一个元素 ...

  4. spring boot:发送带附件的邮件和html内容的邮件(以163.com邮箱为例/spring boot 2.3.2)

    一,网站哪些情况下需要发送电子邮件? 作为一个电商网站,以下情况需要发邮件通知用户: 注册成功的信息 用邮箱接收验证码 找回密码时发链接 发送推广邮件 下单成功后的订单通知 给商户的对账单邮件 说明: ...

  5. HTML DOM Document的实际应用

    HTML文档中可以使用以下属性和方法: 属性 / 方法 描述 document.activeElement 返回当前获取焦点元素 document.addEventListener() 向文档添加句柄 ...

  6. 论文解读《Learning Deep CNN Denoiser Prior for Image Restoration》

    CVPR2017的一篇论文 Learning Deep CNN Denoiser Prior for Image Restoration: 一般的,image restoration(IR)任务旨在从 ...

  7. linux启动oracle服务 和监听

    (1) su - oracle 切换成oracle 用户 (2)sqlplus / as sysdba (3)startup: (4)quit:退出sql模式 exit 退出oracle用户 (5)l ...

  8. 01 . Go框架之Gin框架从入门到熟悉(路由和上传文件)

    Gin框架简介 Gin是使用Go/Golang语言实现的HTTP Web框架, 接口简洁, 性能极高,截止1.4.0版本,包含测试代码,仅14K, 其中测试代码9K, 也就是说测试源码仅5k左右, 具 ...

  9. Ubuntu下创建apt源

    1. 下载所需安装文件 sudo apt-get install soft name  安装并保存安装文件 或者 sudo apt-get source soft name      只下载安装文件 ...

  10. scrapy和scrapy-redis 详解一 入门demo及内容解析

    架构及简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. Scrapy 使用了 Twisted(其主要对手是Tornado)异步网络框架来处理 ...