当前位置: 首页 > 知识库问答 >
问题:

Java摆动让线等待一次

公孙霖
2023-03-14

我正在尝试让我的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秒...

老实说,我对线程和JavaSwing的了解并不是最好的(尤其是当我试图从甲骨文网站上读到的了解Swing工人时),所以如果答案详细,我将不胜感激。

谢谢

共有1个答案

公冶峰
2023-03-14

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

你说,它执行最后两行。停下来想知道它是什么吗?

这是一根线。线程是Java程序中执行代码的部分,执行的每一行都是由某个线程执行的。

当您的代码调用invokeLater()时,它正在提交一个任务(即一段代码),由Swing的事件调度线程(EDT)执行;当你的代码调用swingWorker时。execute()它正在提交一个任务,由Swing的一个后台线程执行。

在一个程序中有多个线程的关键是,它们可以同时做不同的事情。

在您的情况下,您让EDTHibernate了两秒钟,而与此同时,其他线程正在调用boardLogo。重新绘制() 和<代码>boardLogo。重新验证()

关于Swing和多线程,有几件重要的事情需要了解:

>

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

    事件处理程序不应执行任何耗时超过一秒钟的操作,因为在处理程序返回之前,您的应用程序将无法响应任何其他事件(即,它将显示为“挂起”)。

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

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

    SwingWorker的主要用例与此截然相反:它是一个在EDT中运行的事件处理程序如何启动一个需要超过一小部分秒才能完成的任务。

    您可以通过Swing并发教程了解这些内容:https://docs.oracle.com/javase/tutorial/uiswing/concurrency/

  •  类似资料:
    • 问题内容: 在JFrame中,当我单击“登录”时,我弹出另一个Jframe,即登录窗口。 在执行其他操作之前,如何使主Jframe等待登录Jframe退出? 问题答案: 只需使用模式对话框代替框架即可,这样在关闭对话框之前您无法做其他任何事情 有关说明,请参见http://mindprod.com/jgloss/modal.html;有关代码示例,请参见http://www.java2s.com/

    • 问题内容: 我有以下情况: 为了运行算法,我必须运行多个线程,并且每个线程都会在死之前设置一个实例变量x。问题是这些线程不会立即返回: 我应该使用等待通知吗?还是我应该嵌入一个while循环并检查是否终止? 感谢大家! 问题答案: 创建一些共享存储来保存每个线程的值,或者如果足够的话,只存储总和。使用a 等待线程终止。每个线程完成后都会调用,您的方法将使用该方法来等待它们。 编辑: 这是我建议的方

    • 这是一个提倡的范例,即 wait() 应该在同步块内的 while 循环中调用。 我的问题是,waiting()线程如何获得锁? 考虑线程1首先运行并开始等待条件。它释放锁,线程2获得锁设置条件并通知线程1。现在线程1获得锁,检查条件并开始执行“做某事”。 我的问题是当线程1被通知它从time条件开始执行时,已同步(mon)的代码行永远不会再次执行,那么线程1如何获得锁?将锁还给线程1的内部动态是

    • 嗨,我正在做一个项目,我已经达到了我非常困的部分。我试图寻找方法来学习如何在繁忙的等待中编写 while 循环,但我没有找到任何东西,我的代码只是作为无限循环运行。有人可以帮助我解释一个繁忙的等待循环应该如何工作,并帮助我打破这个无限循环吗? 该项目希望做到以下几点:早上,学生醒来后(这需要一段随机的时间),他会去洗手间为新的上学日做准备。如果浴室已经客满,学生需要Rest一下(使用yield()

    • 如果一个线程已经获取了锁,我希望其他线程跳过获取锁的尝试,只需等待释放锁,然后再继续执行。我不希望其他线程在释放锁后获取它。 我一直在研究这个问题,但仍然感到困惑。 请参阅以下通用代码段: 我怎么能让线程进入我的其他块等待重入锁被解锁之前继续执行?

    • 我正在我的UI线程中调用一个方法。在这个方法中创建了一个新线程。我需要UI线程等待这个新线程完成,因为我需要这个线程的结果来继续UI线程中的方法。但我不想让UI在等待时冻结。有没有办法让UI线程在不忙的情况下等待?。