【问题标题】:How to call the same method for two different objects in Java如何在Java中为两个不同的对象调用相同的方法
【发布时间】:2015-11-07 00:06:00
【问题描述】:

我正在编写一个程序,旨在让两个不同的矿工收集地图的资源并将其带回他们所属的城市。这是描述他们收藏的方法:

public void harvest(ArrayList<Resource> rez, SimpleWindow w) {
    double min = Integer.MAX_VALUE;
    int tracker = 0;
    for (int i = 0; i < rez.size(); i++) {
        if (Math.hypot(rez.get(i).getX() - this.x, rez.get(i).getY() - this.y) < min) {
            min = Math.hypot(rez.get(i).getX() - this.x, rez.get(i).getY() - this.y);
            tracker = i;
        }
    }
    moveTo(rez.get(tracker).getX(), rez.get(tracker).getY(), w, rez);
    this.value = this.value + rez.get(tracker).getValue();
    SimpleWindow.delay(200);
    rez.get(tracker).undraw(w);
    rez.remove(tracker);
    moveTo(city.getX(), city.getY(), w, rez);
    city.addResource(this.value);
    SimpleWindow.delay(200);

}

当我在这样的无限循环中为两个不同的矿工调用此方法时(其中 r 是资源对象的 ArrayList,w 是我的图形窗口)...

Miner robot = new Miner(500, 235, city1);
Miner robot1 = new Miner(850, 430, city2);
while (true){
    robot.harvest(r, w);
    robot1.harvest(r, w);
    city1.draw(w);
}

...他们只是轮流收集资源,而不是同时进行。我理解这个原因,但不知道有什么办法可以解决这个问题。

我尝试过像这样使用单独的线程...

Thread t1 = new Thread(new Runnable() {
    @Override
    public void run() {
        while (true){
            robot.harvest(r, w);
        }
    }
});

Thread t2 = new Thread(new Runnable() {
    @Override
    public void run() {
        while (true){
            robot1.harvest(r, w);
        }
    }
});

这在一定程度上是因为矿工同时开采,但它也产生了一系列图形故障和资源对象的 ArrayList 问题。有没有办法解决这个问题?

【问题讨论】:

标签: java multithreading arraylist


【解决方案1】:

您应该在 ArrayList 中使用 Collections.synchronizedList()。

至于图形故障,不太确定。

【讨论】:

  • 使用线程安全的列表对象不会有帮助,因为harvest() 函数对列表执行非原子操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 2021-03-05
  • 1970-01-01
相关资源
最近更新 更多