我目前正在編寫一個包含一堆按鈕的Swing接口的小應用程序。現在我的問題如下:啓動應用程序後,調用一個方法,我想等待兩個按鈕被按下,然後正常進行。我有兩個線程,一個是主線程,另一個是爲了等待兩個按鈕被按下而創建的。對於按鈕,我像往常一樣添加了一個ActionListener,它將變量加1,並調用一個方法,當變量爲2時喚醒另一個。
因此,這裏是我的代碼:Java中的多線程:等到兩個按鈕被按下?
int counter = 0;
static Thread thread1;
static Thread thread2;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
thread1 = new Thread() {
@Override
public void run() {
MainFrame frame = new MainFrame();
frame.setVisible(true);
start();
}
};
thread1.start();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public MainFrame() {
//other stuff and similar Listeners
JButton button1 = new JButton();
button1.addActionListener(new ActionAdapter() {
@Override
public void actionPerformed(ActionEvent ae) {
count++;
notifyIfTwo();
}
});
}
public void notifyIfTwo() {
if (count == 2) {
synchronized(thread2) {
notifyAll();
}
}
}
public void start() {
thread2 = new Thread() {
@Override
public void run() {
try {
synchronized(thread1) {
thread2.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread2.start();
//other stuff
}
不管我怎麼做,我總是得到一個拋出:IllegalMonitorStateException。我也試過用thread2內的一個循環來檢查計數器是否爲2,但是我得到了相同的結果。我認爲它與同步問題有關,但我對整個多線程的新東西很陌生,所以如果能讓我指出正確的方向,我將不勝感激。
或者你甚至可能知道一個更簡單的方法來做整個「等到兩個按鈕按下」 - 問題?
預先感謝,
問候
這甚至沒有編譯!什麼是'線程'?你在騙我們嗎? – Ingo 2013-03-21 12:21:26
沒有編輯過它。犯了一個錯誤簡化了它。這是我想寫的一個小遊戲。我只是想盡可能避免不必要的東西。對不起:) – 2013-03-21 12:23:38
@HolgerPappenstiel你能糾正任何編譯錯誤。例如'Thread.wait()'和'notifyAll()'。這兩個我都希望拋出IllegalMonitorStateExceptions。我喜歡這樣的想法,即您正在嘗試創建一小部分代碼,但該子集至少應該是正確的。你的'run'方法中的'start()'會拋出一個RuntimeException來啓動同一線程兩次 – 2013-03-21 12:29:37