当前位置: 首页 > 面试题库 >

防止在后台任务期间锁定Swing GUI

黄泰宁
2023-03-14
问题内容

我有一个可以存储对象列表的swing应用程序。当用户单击按钮时,

我想对列表中的每个对象执行两项操作,然后完成操作,然后在JPanel中绘制结果图。我一直在尝试SwingWorker,Callable和Runnable进行处理,但是无论我做什么,在处理列表(由于绑定到IO最多可能需要几分钟的时间)时,GUI都被锁定了。

我感觉这可能是我调用线程或某种方式的方式,或者可能与图形功能有关?这不是线程化的,因为它很快。

我也必须依次执行两个处理阶段,所以确保第二个已经等待第一个的最佳方法是什么?我用过join(),然后

while(x.isAlive())  
{  
        Thread.sleep(1000);  
}

尝试确保这一点,但我担心这也可能是我遇到问题的原因。

我一直在到处寻找一些指针,但是由于找不到任何指针,因此我确定自己在这里做一些愚蠢的事情。


问题答案:

问题是,您长期运行的任务正在阻塞使GUI保持响应状态的线程。

您需要做的是将长期运行的任务放在另一个线程上。

一些常用的方法是使用Timers或SwingWorker

在Java教程有很多关于这些东西在他们的并发教训的信息。

要确保第一个任务在第二个任务之前完成,只需将它们都放在同一线程上即可。这样,您不必担心保持两个不同的线程正确计时。

这是您的情况的SwingWorker的示例实现:

public class YourTaskSwingWorkerSwingWorker extends SwingWorker<List<Object>, Void> {
    private List<Object> list
    public YourClassSwingWorker(List<Object> theOriginalList){
        list = theOriginalList;
    }

    @Override
    public List<Object> doInBackground() {
        // Do the first opperation on the list
        // Do the second opperation on the list

        return list;
    }

    @Override
    public void done() {
        // Update the GUI with the updated list.
    }
}

要使用此代码,当触发修改列表的事件时,请创建一个新的SwingWorker并告诉它启动。



 类似资料:
  • 问题内容: 我尝试定期在JavaFX应用程序后台线程中运行,这会修改一些GUI属性。 我想我知道如何使用Task和Service类,并且不知道如何在不使用Thread#sleep()方法的情况下运行此类定期任务。这将是很好,如果我可以使用一些Executor从Executors编造的方法) 我尝试Runnable每5秒运行一次,这会重新启动,javafx.concurrent.Service但立即

  • 我们在让后台服务工作方面遇到了一些麻烦。即使在应用程序关闭和手机锁定的情况下,计时器也应该每秒执行一次代码。只要应用程序打开或在后台,手机正在使用,这就可以正常工作,但当手机被锁定并处于待机状态时,服务会在一段时间后自动停止。 代码是根据以下示例建模的:http://arteksoftware.com/backgrounding-with-xamarin-forms/ 然后,在PCL中: 最后,当

  • 我尝试定期在JavaFX应用程序后台线程中运行,这修改了一些GUI属性。 我想我知道如何使用和类从和不能弄清楚如何运行这样的周期性任务不使用方法。这将是很好的,如果我可以使用一些从编造方法() 我试图每5秒运行,这会重新启动,但它会立即挂起,因为甚至被调用... 最后我使用执行器。newSingleThreadScheduledExecutor(),它每5秒启动一次my,并使用以下命令运行另一个:

  • 说明 在后台任务中,因为是运行在task进程,所以无法使用协程和协程客户端。如果你要操作数据库或Redis,一定要配置同步的连接池。 配置 项目配置文件中mainServer.configs.task_worker_num一定要配置为大于0,否则无法使用后台任务。 定义任务执行类 <?php namespace Test; use Imi\Task\TaskParam; use Imi\Task

  • 我有一个压缩图像的任务,它在图像中使用了许多循环: 我在普通线程中运行此方法,如下所示: 或者在后台工作线程中运行 问题是:这种方法有时会出错,在接收无效输入时会导致无限循环。在这种情况下,它将永远运行,并损害CPU,即使当设备的屏幕关闭时,这会增加设备的温度(如果我使用工作线程,它还会阻止等待队列中的其他任务)。 我想我需要设置一个超时来终止长时间运行的任务。在正常Java线程中实现这一点的最佳

  • 问题内容: 我正在制作一个Android应用程序,该应用程序对您所能获得的积分有时间限制。但是,如果您关闭该应用程序,计时器将继续运行。应用程序暂停时如何暂停? 问题答案: 您可以用类似的方法取消它 并使用该变量保存在一个或其他持久变量中。然后再次使用该变量以启动计时器 共享偏好