Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的多线程(银行队列)_Java_Multithreading - Fatal编程技术网

Java中的多线程(银行队列)

Java中的多线程(银行队列),java,multithreading,Java,Multithreading,我尝试开发一个银行分行。我想生成一个新客户,并将该客户添加到队列(或ArrayList)中。如果有可用的出纳员(有2名出纳员),请从列表中删除客户并将其分配给出纳员。我使用了两个线程,第一个是生成客户并添加到列表中。第二个是属于出纳员的。我有一些问题 客户类别 public class Customer { private int customerID; private int processTime; ArrayList<Integer> customerIDList = new

我尝试开发一个银行分行。我想生成一个新客户,并将该客户添加到队列(或ArrayList)中。如果有可用的出纳员(有2名出纳员),请从列表中删除客户并将其分配给出纳员。我使用了两个线程,第一个是生成客户并添加到列表中。第二个是属于出纳员的。我有一些问题

客户类别

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();
}
}