繁体   English   中英

Java Swing使线程等待一次

[英]Java Swing making the thread wait once

我试图让我的GUI在图形中最近更新后等待2秒。 这意味着我使用后:

    boardLogo.repaint();
    boardLogo.revalidate();

我希望GUI等待进行进一步的计算,然后再次绘制它们。

编码:

        SwingUtilities.invokeLater(new Runnable() {
            @SuppressWarnings("rawtypes")
            @Override
            public void run() {
                SwingWorker swingWorkerExample = new SwingWorker(){
                    @Override
                    protected Object doInBackground() throws Exception {
                        return null;
                    }
                    protected void done(){
                        try {
                            Thread.sleep(2000); //wait 2 seconds.
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                };
                swingWorkerExample.execute();
            }
        });
        //.... more code here
        boardLogo.repaint();
        boardLogo.revalidate();

但是当我运行它时-首先它执行最后两行,然后等待2秒钟...

老实说,我对Threads和Java Swing的了解不是最好的(特别是在了解swing worker时,我已经尝试从Oracle网站上进行了了解),因此,如果答案会很详细,我将不胜感激。

谢谢!

当我运行它时-首先它执行最后两行,然后等待2秒钟...我对线程和Java Swing的了解不是最好的。

您说, 执行最后两行。 曾经停下来想知道是什么吗?

是一个线程。 线程是Java程序中执行代码的对象,执行的每一行都由某个线程执行。

当您的代码调用invokeLater() ,它将提交要由Swing的事件分配线程 (EDT)执行的任务 (即一段代码)。 当您的代码调用swingWorker.execute()它正在提交要由Swing的后台线程之一执行的任务。

在程序中有多个线程的整点是,他们可以在同一时间做不同的事情。

在您的情况下,您使EDT睡眠了两秒钟,与此同时,其他线程正在调用boardLogo.repaint(); boardLogo.revalidate();


关于Swing和多线程,有几件重要的事情要知道:

  • 您所有的事件处理程序都将由EDT运行。

  • 事件处理程序绝不应该花费超过一秒钟的时间,因为在处理程序返回之前,您的应用程序将无法响应任何其他事件(即,它看起来像是“挂起”)。

  • 不允许其他任何线程与Swing的GUI组件进行交互。

invokeLater()一个重要用例是,后台线程中运行的代码如何与GUI组件进行通信。 invokeLater()提交将在EDT中运行的任务 (即一段代码)。

SwingWorker的主要用例与之完全相反:这是在EDT中运行的事件处理程序如何启动一项任务的过程 ,该任务将花费一秒钟以上的时间来完成。


您可以通过Swing并发教程中的方法来学习这些知识: https : //docs.oracle.com/javase/tutorial/uiswing/concurrency/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM