2015-11-07 67 views
0

我正在編寫一個程序,旨在讓兩個不同的礦工收集地圖的資源並將其帶回到它們所屬的城市。這是描述他們的收集方法:如何調用Java中兩個不同對象的相同方法

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和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的一系列圖形故障和問題資源對象。有沒有辦法解決這個問題?

+1

當您的礦工訪問共享列表時,您沒有使用任何互斥功能。在進一步學習之前,您可能應該通過Java「併發」教程學習:https://docs.oracle.com/javase/tutorial/essential/concurrency/當您進入「同步」章節時,請密切關注。 –

回答

0

你應該使用ArrayList的一個Collections.synchronizedList() insead。

至於圖形故障,並不確定。

+1

因爲'harvest()'函數在列表上執行非原子操作,所以使用線程安全列表對象將不會有幫助。 –

相關問題