【发布时间】: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“并发”教程:docs.oracle.com/javase/tutorial/essential/concurrency 进入“同步”一章时请密切注意。
标签: java multithreading arraylist