题目

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

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

* 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. 为什么在M3架构中 PC总是返回加4

    由于CPU是3级流水线的方式运行.在执行第一条指令时候,已经对第二条指令译码,对第三条指令取值. PC总是指向正在取值的指令.由于在M3架构中,采用Thumb-2指令,每个指令占据2个字节,所以PC总 ...

  2. AntDesign初体验

    AntDesign初体验 作为一个java开发也需要掌握一定的前端开发技能,毕竟靠人不如靠自己.再者,有时候一些小的改动自己就可以搞定了,就不用低三下四去求别人了: 安装Nodejs $ npm in ...

  3. IDEA项目区模块文件变为红色解决办法

    解决方法 先检查文件格式是否为.java格式..class格式就不行. 选择file–>setting–>version Controller,然后把vcs选项选择为none

  4. C语言-入门级编程语言--编程小白首选

    我们都知道计算机很厉害,利用计算机可以高效地处理和加工信息,随着计算机技术的发展,计算机的功能越来越强大,不但能够处理数值信息,而且还能处理各种文字.图形.图像.动画.声音等非数值信息.   在199 ...

  5. 【UR #2】猪猪侠再战括号序列

    UOJ小清新题表 题目摘要 UOJ链接 有一个由 \(n\) 个左括号 "(" 和 \(n\) 个右括号 ")" 组成的序列.每次操作时可以选定两个数 \(l, ...

  6. Vue实例中封装api接口的思路 在页面中用async,await调用方法请求

    一般我们写小型的项目是用不到封装axios实例 但是当我们写大型项目时  接口有时候多到有上百个接口,那我们在请求一次调用一次接口,接口上好多都是重复的,这个时候我们就可以封装axios实例,既节省了 ...

  7. 浅谈1——用Eclipse调试JAVA程序

    本篇博客主要介绍如何用Eclipse调试简单的JAVA程序. 1.如下图,一个简单的JAVA程序  2.设置断点. 方法:选中需设置断点的行代码,按快捷键Ctrl+Shift+B,设置断点: 断点设置 ...

  8. java如何实现一个Future

    实现Futrue接口 public class MsgFuture<V> implements java.util.concurrent.Future<V> { ... ... ...

  9. BrowserSync 热更新的使用(保存后自动刷新)

    BrowserSync使用的优点,BrowserSync监听条件中的文件,发现更新会立刻刷新浏览器,就像 vue中的热更新一样,解放F5实现自动更新,提高开发效率, 解决了使用双屏幕时来回切换的烦恼! ...

  10. window.open浏览器弹出新窗口被拦截—原因分析和解决方案

    最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,在本机实验没问题,到了服务器就被拦截了,火狐有拦截提示,360浏览器拦截提示都没有,虽然在自己的环境可以对页面进行放行,但是对用户 ...