【问题标题】:Multiple SwingWorkers with ExecuterService does not work properly具有 ExecuterService 的多个 SwingWorker 无法正常工作
【发布时间】:2012-04-23 13:09:59
【问题描述】:

我正在使用 swing,在我的应用程序中,我需要并行运行多个线程,例如每 5 秒检查一次互联网连接、监控文件系统更改、sycing来自服务器的文件。

上述所有耗时的任务都在 SwingWorker 中运行,因此我的 GUI 不会冻结。

同时我需要运行一些其他耗时的任务,例如将文件上传到服务器。为此,我还使用了 swingWorker。然后我将所有这些 swingworker 提交给 executerService 进行线程池,这样它们就不会相互影响。

我的执行器服务是这样的。我认为 30 个线程对我来说就足够了。

static ExecutorService threadExecutor;
threadExecutor = Executors.newFixedThreadPool(30);

然后我在同一个服务中提交线程。

threadExecutor.submit(monitorinternetconnectivity); //submitting swingworker obejct

我在开始时提交的一些线程和我添加运行时的一些线程,当我在运行时添加时,它不会完成作业或停止运行它们的作业,例如监控互联网连接。

有没有什么方法可以拥有与 swingworker 相同的功能,或者是使用多个 swingworker 的最佳方式。我们应该能够在运行时将新的 swingwokers 添加到 executer 服务

【问题讨论】:

  • 我不明白您为什么要将SwingWorker 的执行委托给ExecutorServiceSwingWorker 不会阻塞当前线程,因为它将在后台线程中完成所有工作,直到完成。完成后,任务将在 EDT 中执行。
  • ExecutorService 如果工作是一项正在进行的任务,则该工具是错误的。一个长时间运行的任务需要它自己的线程,仅此而已,线程池没有任何好处,除了您最终会在队列中等待任务,因为池中的所有线程都在忙于执行正在进行的任务。
  • 上次我从自己的实验中检查,SwingWorkers 使用 10 个线程的有限线程池。我不知道这是否是一般规则,但您可以很容易地编写一个测试程序来查看您在您的环境中提出了什么。
  • @HovercraftFullOfEels 你的记忆是正确的。看源码看到javax.swing.SwingWorker#MAX_WORKER_THREADS字段常量值为10,这个是用来构造线程池的

标签: java swing swingworker executorservice


【解决方案1】:
  1. SwingWorker 使用它自己的线程池。
  2. 在需要更新 GUI 之后(即任何需要超过几毫秒的任务),应将 SwingWorker 用于长时间运行的任务。
  3. 不应在 EDT 之外调用更新 gui 元素(即来自 SwingWorker.done() 方法)

如果您通常遵循在 EDT 内访问 Swing 组件表单的规则(查看 here),那么您应该不会遇到锁定问题。我怀疑问题在于您的代码,但要确定我们应该看到它。

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多