2014-01-27 170 views
-1

我有一個特定的需求,我想在兩個線程之間進行通信。線程同步和信號

我想使用Java 1.6

讓我們假設來實現這個多線程的使用情況下,我們必須確保使用無人駕駛飛機的區域。該區域可以在X軸上測量100km,在Y軸上測量100km。在這個平面上的每個鄉紳公里都可以使用{x,y}座標來定位。例如{0,1} {0,2} {0,3} {0,4} {0,5}無人駕駛飛機可以有其預定義的飛行路徑(它可以是隨機的,在這個平原中的任何地方),例如{0,1} {0,2} {0,4} {0,5} {0,6}。他們必須繼續從{0,1}飛到{0,6}。一旦無人機到達目的地,它應該開始其旅程,例如從{0,6}到{0,1},並保持飛回來和第四,除非停止。

但是一個轉折點 - 讓我們說上面的飛行路徑drone1從{0,1}開始,到達{0,2}。無人駕駛飛機1將保持懸停在{0,2},直到另一架無人機釋放它。例如drone2具有完全不同的飛行路徑,但是有一個或路徑作爲drone1兩個共同立場,將指導drone1「你可以從這個位置釋放自己,保持飛往你的路,因爲我在這裏獲得這個位置」 。

如果你理解了使用正確的情況下,這裏的問題是,線程1它已經收購了在{0,2}鎖,必須等待,直到線程2指示將其釋放。

我們如何做到這一點,如何發送消息到另一個線程,並等到位置爲空?

+0

與我們分享您的解決問題的嘗試。 – LorDex

+1

我不知道該怎麼做。正如我在問題中提到的那樣,thread1已經獲得位置{0,2}上的鎖定。兩個線程之間唯一的碎片就是位置,我找不到同步的方式來在thread1和其他嘗試獲取鎖的線程之間進行通信。 – Gunwant

+0

在什麼語言,你應該寫的嗎?對於同一件事,不同的語言可能會有不同的詞。 – Dialecticus

回答

0

這是一個使用wait()和notify()的經典示例。一旦無人機到達目的地,它將進入一個等待的同步塊()。這將釋放同步塊上的鎖定。一旦無人機2到達,它會調用notify()。這喚醒了無人機1.

public class Square(){ 

... 


public void arriveOnSquare(){ 
    notify(); 
    ... 
    synchronized(this){ 
     wait(); 
    } 
    ... 
} 
} 
+0

這是一個好主意,謝謝。 – Gunwant

0

有兩種常用的方法來線程間信令:

  • 一個線程執行其程序在while(signal)循環,並退出當信號變成false
  • 通過通信信道酷似對象,例如爲ConcurrentLinkedQueue,信號發送者不斷推動「任務」到隊列中,而繁忙的線程不斷從它拉出。只要有任務要做,忙線程將繼續工作,而且只要沒有更多的工作留停止。