[英]Main Thread freezes all other threads inclusive java gui thread
注意:我花了很多時間研究Google和stackoverflow,但找不到答案。
我在JDialog中使用Thread.sleep(),它凍結了所有其他JDialog,JFrame和線程。
我的示例代碼:
public Guitest()
{
setSize(300,300);
// create a JDialog that make guitest wait
MyDialog dlg = new MyDialog();
dlg.setSize(100,100);
dlg.setVisible(true);
while(dlg.isWait())
{
try
{
Thread.sleep(1000);
} catch (InterruptedException ex)
{
Logger.getLogger(Guitest.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("waiting mydialog");
}
}
class MyDialog extends JDialog
{
boolean wait = true;
JButton btn = new JButton("OK");
public MyDialog()
{
setSize(50,50);
btn.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
wait=false;
}
});
add(btn);
}
public boolean isWait()
{
return wait;
}
}
在這種情況下,JDialog無法正確顯示:
但是必須這樣:
我怎么解決這個問題。 我想讓主線程等待另一個線程,有人可以在這種情況下更正我的示例代碼或共享示例代碼。
恕我直言,似乎您只有一個正在運行的線程。 首先,我們繪制JDialog,之后,由於等待標志,您使主線程休眠。 即。 您無法執行按鈕操作偵聽器,因此無法喚醒線程。
希望它能幫助理解。
Thread.Sleep()
只是休眠當前線程(即停止執行任何操作,如重繪,處理單擊等),在您的情況下,該UI thread
是UI thread
。
您需要使用輔助線程。 任何需要完成的,可能花費大量時間的主要工作都需要在其自己的線程中完成,這就是您要休眠的線程。 它當前與UI組件一起運行,因此這就是為什么您看到它們凍結的原因。
一個很好的參考是swing
並發性文檔http://docs.oracle.com/javase/tutorial/uiswing/concurrency/
以下內容也可能有用:
http://java.sun.com/developer/technicalArticles/Threads/swing/ http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.