我正在使用 swing,在我的应用程序中,我需要并行运行许多线程,例如每 5 秒检查一次互联网连接、监控文件系统更改、从服务器收集文件。
像上面这样耗时的所有任务都在SwingWorker
运行,所以我的 GUI 不应该冻结。
同时,我需要运行一些其他耗时的任务,例如将文件上传到服务器。 为此,我还使用了SwingWorker。 然后我将所有这些 swingworker 提交给 executerService 进行线程池化,这样它们就不会相互影响。
我的执行程序服务是这样的。 我认为 30 个线程对我来说就足够了。
static ExecutorService threadExecutor;
threadExecutor = Executors.newFixedThreadPool(30);
然后我在同一服务中提交线程。
threadExecutor.submit(monitorinternetconnectivity); //submitting swingworker obejct
我在开始时提交的一些线程和一些我添加运行时的线程,当我在运行时添加时,它不会完成作业或停止运行其作业,例如监控互联网连接。
有没有办法像秋千工人一样具有相同的功能,或者使用多个秋千工人的最佳方法。 我们应该能够在运行时添加新的 Swingwoker 来executer
服务
- SwingWorker 使用自己的 ThreadPool。
- SwingWorker 应该用于长时间运行的任务(即任何需要超过几毫秒的任务),之后需要 GUI 更新。
- 不应在 EDT 之外调用更新 gui 元素(即从 SwingWorker.done() 方法)
如果您通常遵循访问 EDT 内部 Swing 组件表单的规则(查看此处),那么您应该不会有锁定问题。我怀疑问题出在您的代码中,但为了确保这一点,我们应该看到它。