如何在Java中为两个不同的对象调用相同的方法

时间:2015-11-07 00:06:00

标签: java multithreading arraylist

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

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

}

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

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问题。有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

你应该使用你的ArrayList的Collections.synchronizedList()内容。

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