【问题标题】:Stuck on a Homework using ArrayDeque and Threads in Java?在 Java 中使用 ArrayDeque 和 Threads 完成作业?
【发布时间】:2014-06-03 23:22:37
【问题描述】:

这是我的问题

一家健康中心雇佣了两名医生,每天最多检查和治疗 25 名患者。 两名医生中的任何一名医生都会对患者进行检查和治疗。每个病人都必须登记自己的名字,以便医生按照先到先得的原则对病人进行检查和治疗。

练习 2 Part a:针对上面提到的场景2,开发一个程序,创建病人和医生(都是线程)。患者排队登记,医生在先到先得的基地从同一队列中挑选患者并进行检查和治疗。使用非线程安全的队列(例如 ArrayDeque)。确保您的程序没有同步问题。

B 部分:使用线程安全的队列(例如 ArrayBlockedQueue)并检查您的解决方案是否存在同步问题。 (确保您的解决方案不提供同步方法或同步块)

这是我的代码

package lab8;

import java.util.ArrayDeque;

public class LAB8 {
class Doctor implements Runnable {
    private String name;
    private Patient patient;
    Doctor (String n){
        name = n;
    }
    public void examine (){
        System.out.println("Doctor is now examining the patient");
    }
    public void treat(){
         System.out.println("Doctor is now treating the patient");
    }
    @Override
    public void run (){


        }
    }


static  class Patient implements Runnable {
    private String name;
    Patient (String n){
        name = n;
    }

    public void register(String name){
        System.out.println(name + " is registering in Queue");
    }
    @Override
    public void run(){       
         ArrayDeque<Patient> Patients = new ArrayDeque(25);
        for(int i = 0;i<25;i++){
            Patients.add(new Patient("Patient No " + i));
            Patients.removeFirst().register("Patient No " + i);
        }
}

}

public static void main(String[] args) {
    ArrayDeque<Patient> Patients = new ArrayDeque(25);
    for(int i = 0;i<25;i++){
        (new Thread (Patients.removeFirst())).start();
    }
}

}

这是我运行时遇到的错误。

线程“main”中的异常 java.util.NoSuchElementException 在 java.util.ArrayDeque.removeFirst(ArrayDeque.java:278) 在 lab8.LAB8.main(LAB8.java:50) Java 结果:1

我现在只在尝试 A 部分。

【问题讨论】:

标签: java multithreading arraydeque


【解决方案1】:

在您的主函数中,Patients ArrayDeque 对象没有 Patient 对象。相反,它是空的,因此没有什么可以从队列中删除。您需要先添加一些患者。

ArrayDeque<Patient> Patients = new ArrayDeque(25);
for(int i = 0;i<25;i++){
    (new Thread (Patients.removeFirst())).start();
}

您需要像在此处一样首先将新患者添加到 Patients ArrayDeque。

Patients.add(new Patient("Patient No " + i));

所以你有这样的东西......

public static void main(String[] args) {
    ArrayDeque<Patient> Patients = new ArrayDeque(25);
    for(int i = 0;i<25;i++){
        Patient p = new Patient("Patient No " + i);
        (new Thread (p)).start();
        Patients.add(p);

    }
}

【讨论】:

  • 在Doctor的run()中实现上面的,然后在main中创建Doctor线程,我的输出被打印了两次。你能告诉我这是为什么吗?
  • 如何再次向您展示我的代码。这有点令人困惑:/
  • 我认为这是因为您注册了两次患者。一次在main() 函数中,另一次在Patient.run() 中。将Patients 添加到ArrayDeque 后。启动 Doctor 线程并在 Doctor.run() 方法中,在那里调用 ArrayDeque.removefirst()。让我知道这是否有意义。
  • 我希望我可以向您展示我的代码,但我是新来的,还在学习如何发布,但我无法弄清楚。无论如何,非常感谢您在这个问题上花费的时间和精力。谢谢你,至少我可以输出一些东西:) +1
  • 哇哦!非常感谢 :) 一旦我达到 15+ REP,我肯定会投票给你。你是最棒的:)
猜你喜欢
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
相关资源
最近更新 更多