我在處理我的應用程序中的線程時遇到了問題。它創建JFrame並啓動一個新的線程。最後一個將執行外部應用程序並更新GUI。然後在更新Swing時等待線程
我有問題,使Main類等待第二個線程完成,但也要同時更新GUI。
這是我的例子(縮短):
class Main {
public int status;
public Main() {
// Creating GUI etc.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JDialog id = new JDialog();
id.button.addMouseListener(new MouseListener()); // Calls generate() method
}
});
}
public void generate() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Make changes to GUI
}
});
GeneratorThread genTest = new GeneratorThread(this, 1, 1, 1);
genTest.start();
//while (status == 0);
System.out.println("Next step.");
}
}
和線程類:
public class GeneratorThread extends Thread {
protected Main main;
protected int setSize, minValue, maxValue;
public GeneratorThread(Main main, int setSize, int minValue, int maxValue) {
this.main = main;
this.setSize = setSize;
this.minValue = minValue;
this.maxValue = maxValue;
}
public void run() {
// Execute program etc.
// Change GUI from main in the same time
// About 3 seconds
main.status = 1;
}
}
我在進步,我想檢查它是如何工作至今。雖然工作很好,但它以某種方式鎖定Swing,只有當GeneratorThread
完成時,任何更改纔可見。我想實時更新GUI。我試過join()
,效果是一樣的。我也嘗試wait()
(在Main
),但後來我得到IllegalStateMonitorException。
任何提示?
請提供一個SSCCE。真的不清楚你在做什麼以及你想做什麼。 –
很難用提供的代碼來告訴你想要達到的目標。雖然如果您想更新GUI,則意味着更新與正在執行的任務同步完成。你可以看看[SwingUtilities.invokeAndWait(...)](http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingUtilities.html#invokeAndWait(java.lang.Runnable) ))。這裏是一個相關的[示例](http://stackoverflow.com/a/13004927/1057230) –