簡體   English   中英

主線程凍結所有其他線程,包括Java gui線程

[英]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

但是必須這樣:

真實出現jdialog

我怎么解決這個問題。 我想讓主線程等待另一個線程,有人可以在這種情況下更正我的示例代碼或共享示例代碼。

恕我直言,似乎您只有一個正在運行的線程。 首先,我們繪制JDialog,之后,由於等待標志,您使主線程休眠。 即。 您無法執行按鈕操作偵聽器,因此無法喚醒線程。

希望它能幫助理解。

Thread.Sleep()只是休眠當前線程(即停止執行任何操作,如重繪,處理單擊等),在您的情況下,該UI threadUI 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM