模拟叫号看病多线程Java

在医院看病的过程中,通常需要先进行挂号,然后等待医生叫号,最后才能接受治疗。为了更好地模拟这一过程,我们可以使用多线程来实现一个叫号系统。

多线程原理

多线程是指在同一时间内,计算机的CPU可以同时处理多个线程(线程是程序执行的最小单位)。在Java中,可以通过实现Runnable接口或继承Thread类来创建多线程程序。多线程可以提高程序的效率,使得程序可以同时执行多个任务。

程序设计

我们将设计一个模拟叫号看病的程序,包括挂号系统、候诊区和医生叫号。挂号系统负责生成病人号码,候诊区接收病人号码并等待医生叫号,医生叫号负责从候诊区中取出病人号码进行治疗。

类图

使用Mermaid语法绘制类图如下:

classDiagram
class Hospital {
    -Doctor doctor
    -Registration registration
    -WaitingRoom waitingRoom
    +void start()
}
class Doctor {
    -WaitingRoom waitingRoom
    +void callPatient()
}
class Registration {
    +int generateNumber()
}
class WaitingRoom {
    -Queue<Integer> queue
    +void addPatient(int number)
    +int getNextPatient()
}
Hospital --> Doctor
Hospital --> Registration
Hospital --> WaitingRoom
Doctor --> WaitingRoom

代码实现

Hospital类
public class Hospital {
    private Doctor doctor;
    private Registration registration;
    private WaitingRoom waitingRoom;

    public Hospital() {
        this.doctor = new Doctor();
        this.registration = new Registration();
        this.waitingRoom = new WaitingRoom();
    }

    public void start() {
        int patientNumber = registration.generateNumber();
        waitingRoom.addPatient(patientNumber);
        doctor.callPatient();
    }

    public static void main(String[] args) {
        Hospital hospital = new Hospital();
        hospital.start();
    }
}
Doctor类
public class Doctor {
    private WaitingRoom waitingRoom;

    public Doctor() {
        this.waitingRoom = new WaitingRoom();
    }

    public void callPatient() {
        int patientNumber = waitingRoom.getNextPatient();
        System.out.println("Doctor is calling patient number: " + patientNumber);
    }
}
Registration类
import java.util.concurrent.atomic.AtomicInteger;

public class Registration {
    private AtomicInteger atomicInteger;

    public Registration() {
        this.atomicInteger = new AtomicInteger(1);
    }

    public int generateNumber() {
        return atomicInteger.getAndIncrement();
    }
}
WaitingRoom类
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;

public class WaitingRoom {
    private Queue<Integer> queue;

    public WaitingRoom() {
        this.queue = new ArrayBlockingQueue<>(10);
    }

    public void addPatient(int number) {
        queue.add(number);
        System.out.println("Patient number " + number + " is waiting in the waiting room.");
    }

    public int getNextPatient() {
        return queue.poll();
    }
}

运行效果

运行程序后,可以看到挂号系统生成病人号码并加入候诊区,医生叫号后从候诊区取出病人号码,模拟了实际看病的流程。

通过本文的介绍,希望读者对多线程Java编程有更深入的了解,并能够运用多线程技术解决实际问题。多线程可以提高程序的效率,实现更复杂的功能,是Java编程中的重要知识点。