首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同一类型的多个对象如何同时处理另一种类型的对象?

同一类型的多个对象如何同时处理另一种类型的对象?
EN

Stack Overflow用户
提问于 2021-02-21 15:12:42
回答 1查看 47关注 0票数 0

我需要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

如何正确地实现它?

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-21 15:50:29

运行方法有多个问题:

  1. 您正在维护的客户端在您的循环中本地计数。
  2. ,即使每次从TotalClients类获得客户端,在更新之后调用get时都为时已晚,因此这两个操作都应该针对您的具体情况同时执行。
  3. ,如果操作失败,可以再次更新TotalClients中的数字(我的代码中没有提到这个场景)。

代码语言:javascript
复制
    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类应该如下所示:

代码语言:javascript
复制
public class TotalClients {
    private AtomicInteger clients;

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


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


}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66303744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档