Java中的多线程(银行队列)
我尝试开发一个银行分行。我想生成一个新客户,并将该客户添加到队列(或ArrayList)中。如果有可用的出纳员(有2名出纳员),请从列表中删除客户并将其分配给出纳员。我使用了两个线程,第一个是生成客户并添加到列表中。第二个是属于出纳员的。我有一些问题 客户类别Java中的多线程(银行队列),java,multithreading,Java,Multithreading,我尝试开发一个银行分行。我想生成一个新客户,并将该客户添加到队列(或ArrayList)中。如果有可用的出纳员(有2名出纳员),请从列表中删除客户并将其分配给出纳员。我使用了两个线程,第一个是生成客户并添加到列表中。第二个是属于出纳员的。我有一些问题 客户类别 public class Customer { private int customerID; private int processTime; ArrayList<Integer> customerIDList = new
public class Customer {
private int customerID;
private int processTime;
ArrayList<Integer> customerIDList = new ArrayList<>();
ArrayList<Integer> processTimeList = new ArrayList<>();
public int getCustomerID() {
return customerID;
}
public void setCustomerID(int customerID) {
this.customerID = customerID;
}
public int getProcessTime() {
return processTime;
}
public void setProcessTime(int processTime) {
this.processTime = processTime;
}
public ArrayList<Integer> getCustomerIDList() {
return customerIDList;
}
public void setCustomerIDList(ArrayList<Integer> customerIDList) {
this.customerIDList = customerIDList;
}
public ArrayList<Integer> getProcessTimeList() {
return processTimeList;
}
public void setProcessTimeList(ArrayList<Integer> processTimeList) {
this.processTimeList = processTimeList;
}
}
CustomerThread类
public class CustomerThread extends Thread {
Customer c = new Customer();
Methods method = new Methods();
@Override
public void run() {
for(int i = 0; i < 10; i++) {
try {
c.getCustomerIDList().add(i+1);
c.getProcessTimeList().add(method.generateProcessTime());
System.out.println("ID : " + c.getCustomerIDList().get(i) + " - Process Time : " + c.getProcessTimeList().get(i));
Thread.sleep(100);
}
catch (InterruptedException ex) {
Logger.getLogger(CustomerThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
public class TellerThread extends Thread{
Customer c1 = new Customer();
Teller teller1 = new Teller();
Teller teller2 = new Teller();
@Override
public void run() {
try {
Thread.sleep(100);
while(c1.getProcessTimeList().isEmpty()) {
if(teller1.isStatus()) {
teller1.setStatus(false);
System.out.println("Customer " + c1.getCustomerIDList().get(0) + " came teller1.");
c1.getCustomerIDList().remove(0);
Thread.sleep(c1.getProcessTimeList().get(0));
System.out.println("Teller 1 is waiting of " + c1.getProcessTimeList().get(0) + " msec.");
c1.getProcessTimeList().remove(0);
teller1.setStatus(true);
System.out.println("Teller 1 is Available.");
}
else if(teller2.isStatus()) {
teller2.setStatus(false);
System.out.println("Customer " + c1.getCustomerIDList().get(0) + " came teller2.");
c1.getCustomerIDList().remove(0);
Thread.sleep(c1.getProcessTimeList().get(0));
System.out.println("Teller 2 is waiting of " + c1.getProcessTimeList().get(0) + " msec.");
c1.getProcessTimeList().remove(0);
teller2.setStatus(true);
System.out.println("Teller 2 is Available");
}
else {
System.out.println("There is no customer..");
}
}
} catch (InterruptedException ex) {
Logger.getLogger(TellerThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
考试班
public class Test {
public static void main(String[] args) {
CustomerThread ct = new CustomerThread();
TellerThread tt = new TellerThread();
ExecutorService es = Executors.newCachedThreadPool();
es.execute(ct);
es.execute(tt);
es.shutdown();
}
}
当我执行这些代码时,我在输出上只看到客户。没有出纳员流程。我怎样才能解决这个问题 您的出纳员线程正在创建一个新客户,当然,它有一个空的传入客户列表。您的代码在您试图构建的模型中也存在一些问题;您可能希望阅读使实现更容易的类和Java类,比如实现代码质量的类。代码质量方面的旁注:始终记住,您给类起的名字应该告诉读者发生了什么。从这个意义上讲,出纳员中的“状态”字段相当。。。没用。如果你真的想用布尔值;而不是找到另一个名字;或者如果你想保留“状态”的措辞;而不是考虑使用不同的类型(例如某种具有人类可读值的枚举)。然后:你的客户在这两个列表中都有getter,这不是一种好的风格——外界不应该对此感兴趣。相反:在customer类上提供“addid”方法。
public class Test {
public static void main(String[] args) {
CustomerThread ct = new CustomerThread();
TellerThread tt = new TellerThread();
ExecutorService es = Executors.newCachedThreadPool();
es.execute(ct);
es.execute(tt);
es.shutdown();
}
}