课程设计题目,多线程编程:医院门诊模拟,想用java实现,求大神指点

新线程库也有跟老线程库对应的方法,新线程库有线程安全的高效队列。没有上面麻烦,但上面写的是理解新线程数据结构与实现的基础。package com.zhidao;import java.util.LinkedList;import java.util.List;import java.util.Random;public class TestThread2 {//缓冲上限private long bufsize;//缓冲private...
课程设计题目,多线程编程:医院门诊模拟,想用java实现,求大神指点
典型的生产者消费者模型。
了解j5的并发库,那个并发库中有适合组件实现。
如果不了解,这么来:
创建一个队列,此队列要求线程安全,如果队列为空则消费者阻塞。如果队列达到某个最大值,则阻塞生产者。
队列用,普通的list或实现好的队列包装成线程安全的。
用synchronized同步原方法或代码块。
写一个或n个线程,模拟病人,排队办理业务,往上面的队列中添加数据。
当达到队列的最大容积,阻塞,等待生产者线程取数据。
阻塞:makerLock.wait();//虚拟机会出让线程挂起,其实就是操作系统,保存当前线程在cpu上的运行状态。再出让线程正在使用的cpu资源,占用的内存不会释放。
往队列插入数据的时候,因为不知道是否有消费者处于等待状态,通知消费者:
customerLock.notifyAll();//虚拟机调度消费者线程运行,实际上是操作系统,把保存的消费者线程状态,从新加载到cpu中接着运行。接着运行线程是任意的,取决于不同操作系统的线程调度算法。
消费者线程读取一个数据后,要通知生产者,可以继续,道理同上:
makerLock.notifyAll();
队列中,无数据可读的时候:
customerLock.wait();//原理同上,
最后注意,生产者跟消费者使用了两个不同的对象锁。lock.wait()的使用方法是这样的:
synchronized(lock){
... ...
while(condition == true) {
lock.wait();
}
... ...
Object o = queen.pop();
lock.notifyAll();
}
最后启动n个线程读队列,模拟办理业务的窗口;n个线程写队列,模拟病人排队。
新线程库也有跟老线程库对应的方法,新线程库有线程安全的高效队列。没有上面麻烦,但上面写的是理解新线程数据结构与实现的基础。
package com.zhidao;import java.util.LinkedList;import java.util.List;import java.util.Random;public class TestThread2 {//缓冲上限private long bufsize;//缓冲private List<String> buf;public TestThread2() {bufsize = 5;buf = new LinkedList<String>();}//生产者调用public void put(String s) {//模拟生产者跟不上消费者/*try {Thread.sleep(100);} catch (InterruptedException e) {}*/synchronized(this) {//超过队列限制就等待while(buf.size() == bufsize) {System.out.println("队列已满,生产者:"+Thread.currentThread().getId()+"开始等待。");try {this.wait();} catch (InterruptedException e) {}}buf.add(s);//通知消费者this.notifyAll();}}//消费者调用synchronized public String take() {//模拟消费者跟不上生产者try {Thread.sleep(100);} catch (InterruptedException e) {}String s = null;synchronized(this) {while(buf.size() == 0) {System.out.println("队列为空,消费者:"+Thread.currentThread().getId()+"开始等待。");try {this.wait();} catch (InterruptedException e) {}}//取先放入的元素,并移除s= buf.get(0);buf.remove(0);//通知生产者this.notifyAll();}return s;}public static void main(String[] args) {//自己实现的,安全队列final TestThread2 tt = new TestThread2();//生产者Thread p = new Thread(new Runnable(){@Overridepublic void run() {while(!Thread.currentThread().isInterrupted()) {Random r = new Random();tt.put(String.valueOf(r.nextInt(10)));}}});//消费者Thread c1 = new Thread(new Runnable(){@Overridepublic void run() {while(!Thread.currentThread().isInterrupted()) {System.out.println("线程:"+Thread.currentThread().getId()+"获取到数据"+tt.take());}}});Thread c2 = new Thread(new Runnable(){@Overridepublic void run() {while(!Thread.currentThread().isInterrupted()) {System.out.println("线程:"+Thread.currentThread().getId()+"获取到数据"+tt.take());}}});p.start();c1.start();c2.start();try {p.join();c1.join();c2.join();} catch (InterruptedException e) {}}}2017-11-19
驳回原因都是什么2017-11-19
mengvlog 阅读 32 次 更新于 2025-09-10 22:59:39 我来答关注问题0
  • 阻塞:makerLock.wait();//虚拟机会出让线程挂起,其实就是操作系统,保存当前线程在cpu上的运行状态。再出让线程正在使用的cpu资源,占用的内存不会释放。往队列插入数据的时候,因为不知道是否有消费者处于等待状态,通知消费者:customerLock.notifyAll();//虚拟机调度消费者线程运行,实际上是操作系统...

  •  luandyear 求一份操作系统课程设计 (最好原创!不要copy太多次的)

    6、 协作系统:由于“第一发现人”这个概念的出现,当管理小组有多个成员时,可应用此功能。 “第一发现人”为第一个发现该警报信息的人,系统会记录他的名字,如果这个名字在系统中记录的次数多,说明此人工作负责,经常开着本程序。至于发现警报后怎么协作处理,这是一个管理问题。7、 自定义配置:...

  • anonymous 软件工程论文题目

    51、浅析基于安卓系统的移动互联网集成平台开发设计 52、多线程技术在Android手机开发中的运用 53、JavaScript程序动态切片技术的研究 54、基于SmartAdmin的数据维护软件前台的快速构建 55、医院预授权结算系统的设计和实现 56、浅析计算机软件工程的管理和应用 57、生物计算下的分布式计算系统设计及实现 58、浅...

  •  旁笑槐NH 求个JAVA毕业设计题目。高手来!

    flex,最近都流行这玩意,其实做起来挺快的,你可以做个在线视频聊天室,也就1个星期的时间。或者可以自己写个框架,我在做这个,不过是.NET的。写的很痛苦,不过相信比什么XX管理系统要有用些。

  •  黑科技1718 计算机软件技术毕业论文

    下面以《Java程序设计》这门课程为例来介绍如何基于Moodle平台进行混合式教学模式的教学过程设计。 3.1混合式教学模式的教学资源设计 教学资源是混合式教学模式的基本保障,主要指与所授课程相关的教学材料,包括课程的教案、课程的课件、实训指导、教学大纲、复习题、拓展资料等。随着慕课的兴起,在《Java程序设计》课程的...

檬味博客在线解答立即免费咨询

Java相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部