【发布时间】:2013-04-20 12:16:26
【问题描述】:
我有一个以线程为参数的方法。我希望这个方法能够让一个线程等待,如果没有一个线程等待,然后在另一个线程进入该方法时唤醒,以便它们两个可以交互。我想我已经接近了,但是在第一个线程上调用 wait() 之后,没有其他线程可以访问该方法。这是我的代码的极简版本:
// In the class 'Node'
public synchronized void trade(Thread thread)
{
if (!threadWaiting)
{
threadWaiting = true;
synchronized(thread)
{
try {
thread.wait();
} catch (InterruptedException e) {...}
}
}
}
对于遗漏任何明显的东西,我深表歉意,我一直在寻找答案,但我是线程新手,所以我不知道要寻找什么。
所以我的问题是,当另一个线程尝试进入 trade() 时,他们不能,调试器就停在那里。
编辑: 这是我要问的更多说明。恐怕我在原始帖子中不太清楚。
所以我有一个名为 Node 的类和另一个名为 Bot 的类。 Bot 扩展线程以便它可以暂停。在程序开始时,会创建多个 Bot 对象并启动,然后每个 Bot 将调用 Node 的 trade() 方法并将自身传递给该方法。如果 Bot 是方法中的第一个,那么我希望它的线程在节点上等待,直到另一个 Bot 出现(等待的 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
-
你看过
CountdownLatch或CyclicBarrier类吗?
标签: java multithreading concurrency wait