多个相同类型的对象如何同时与另一个类型的对象一起工作?

时间:2021-02-21 15:12:42

标签: java multithreading

我需要4个收银员来为所有客户服务,但结果每个客户都由每个收银台处理,这是不正确的 我的说法不正确:
总时间 2.5 客户 #15 收银员 #2

总时间 3.0 客户 #15 收银员 #4

总时间 2.4 客户 #15 收银员 #3

总时间 2.0 客户 #15 收银员 #1

总时间 6.0 客户 #14 收银员 #4

总时间 4.0 客户 #14 收银员 #1

总时间 4.8 客户 #14 收银员 #3

纠正我的需要:

总时间 2.5 客户 #15 收银员 #2

总时间 3.0 客户 #14 收银员 #4

总时间 2.4 客户 #13 收银员 #3

如何正确实施?

public class CashierThread extends Thread{
    private TotalClients totalClients;
    private Cashier cashier;
    private double totalTime = 0;

    public CashierThread(TotalClients totalClients, Cashier cashier) {
        this.totalClients = totalClients;
        this.cashier = cashier;
    }

    public synchronized void run() {
        int clients = totalClients.getClients();
        while (clients > 0){
            if(isAlive()) {
                double timeCashier = cashier.getAverageTime();
                totalTime += timeCashier;
                System.out.println("Total time " + totalTime + " client #" + clients + " cashier #" + cashier.getId());
                clients--;
                totalClients.setClients(clients);
                try {
                    this.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

public class TotalClients {
    private int clients;

    public TotalClients(int clients) {
        this.clients = clients;
    }

    public int getClients() {
        return clients;
    }

    public void setClients(int clients) {
        this.clients = clients;
    }
}


public class Cashier {
    private double averageTime;
    private int id;


    public Cashier(double averageTime, int id) {
        this.averageTime = averageTime;
        this.id = id;
    }

    public double getAverageTime() {
        return averageTime;
    }

    public int getId() {
        return id;
    }
}

1 个答案:

答案 0 :(得分:0)

您的 run 方法存在多个问题:

  1. 您在循环中本地维护客户端计数。
  2. 即使每次都从 TotalClients 类中获取客户端,在更新后调用 get 时也为时已晚,因此应针对您的特定情况同时执行这两个操作。
  3. 如果您的操作失败,您可以再次更新 TotalClients 中的数字(我的代码中没有涉及该场景)。
    public synchronized void run() {
        int clients = totalClients.getClients();
        while (clients > 0){
            if(isAlive()) {
                double timeCashier = cashier.getAverageTime();
                totalTime += timeCashier;
                System.out.println("Total time " + totalTime + " client #" + clients + " cashier #" + cashier.getId());
                try {
                    this.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                clients = totalClients.getClients();
            }
        }
    }

并且您的 TotalClients 类应如下所示:


public class TotalClients {
    private AtomicInteger clients;

    public TotalClients() {
        this.clients = new AtomicInteger(4);
    }


    //get and update clients
    public int getClients() {
        return this.clients.decrementAndGet();
    }


}