我在我的應用程序中使用了多個線程。基本上我有一個組合框,當選擇收件箱時,p1恢復並且p2被暫停,並且在選擇發送時,p2開始並且p1停止。下面是代碼(我敢肯定,它並不完美)Java線程問題
public void modifyText(ModifyEvent e) {
if (combo.getText().equals("Inbox"))
{
synchronized(p2)
{
p2.cont = false;
}
table.removeAll();
synchronized(p1)
{
p1.cont = true;
p1.notify();
}
}
else if (combo.getText().equals("Sent"))
{
synchronized(p2)
{
p1.cont = false;
}
table.removeAll();
synchronized(p1)
{
p2.cont = true;
p2.notify();
}
}
}
});
和P1和P2我有這樣的while循環內:
synchronized (this) {
while (cont == false)
try {
wait();
} catch (Exception e) {
}
}
...因爲它是它現在的工作(我是一個初學者)。在組合框中按下發送時,我得到一個IllegalStateMonitorException。任何人都可以幫我解決問題嗎?
感謝和問候, Krt_Malta
上閱讀他沒有在AWT線程中等待。他只是打電話給notify()。此外,我建議調用notifyAll()以確保等待的線程得到通知。 – 2010-03-16 18:06:48
通過在EDT中可以導致等待的任何地方使用同步。這不正確嗎? – Pyrolistical 2010-03-16 18:09:24
這是守衛的鎖;他們的鎖在等待時退回到半鎖。這允許另一個線程抓住鎖,然後恢復另一個線程。無論哪種方式,如果您使用notify()或wait(),則您*必須*鎖定對象。有關詳細信息,請參閱http://www.java2s.com/Code/Java/Threads/Threadnotify.htm。 – 2010-03-16 18:22:52