我有這個方法需要一個線程作爲參數。我希望這個方法能夠讓一個線程等待,如果沒有一個已經等待,然後在另一個線程進入方法時喚醒,以便它們中的兩個可以交互。我認爲我很接近,但在第一個線程上調用wait()之後,其他線程無法訪問該方法。這裏是我的代碼版本簡約:Java - 在對象上調用wait(),然後允許對象訪問方法
// In the class 'Node'
public synchronized void trade(Thread thread)
{
if (!threadWaiting)
{
threadWaiting = true;
synchronized(thread)
{
try {
thread.wait();
} catch (InterruptedException e) {...}
}
}
}
我缺少什麼明顯的道歉,我一直在四處尋找一個答案,但我是新的線程,因此我不知道要尋找什麼。
所以我的問題是,當另一個線程試圖進入交易()他們不能,調試器就在那裏停止。
編輯: 這是關於我問的一些更多的澄清。恐怕我原來的帖子不太清楚。
所以我有一個名爲Node的類和另一個名爲Bot的類。 Bot延伸線程以便可以暫停。在程序開始時創建多個Bot對象,然後啓動,每個Bot將調用Node的trade()方法並將其自身傳遞給方法。如果一個Bot是該方法中的第一個,那麼我希望它的線程在Node上等待,直到另一個Bot出現(等待的Bot將存儲在節點中),此時兩個機器人將進行交互。 下面是我的僞代碼方法更清晰的例子:
// Variable to hold the bot that is waiting.
private Bot waitingBot = null;
// Method belonging to Node.
public synchronized void trade(Bot currentBot)
{
if (waitingBot == null)
{
waitingBot = currentBot;
waitingBot.wait();
}
else
{
currentBot.interactWith(waitingBot);
waitingBot.notify();
waitingBot = null;
}
}
對不起我原來的職位的措辭。
你希望他們如何互動?如果您想要將數據從一個線程傳遞到另一個線程,可以使用[SynchronousQueue](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/SynchronousQueue.html) – flup 2013-04-20 12:48:18
你看看['CountdownLatch'](http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html)或['CyclicBarrier'](http:// docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html)類? – 2013-04-20 13:09:30