java - 使用 ThreadPoolExecutor 取消 SwingWorker

标签 java multithreading swing threadpool

我正在使用线程池大小为 1 的 ThreadPoolExecutor 来顺序执行 swing 工作线程。我遇到了一个特殊情况,其中一个事件到达,创建了一个 Swing Worker,它执行一些客户端-服务器通信,然后更新 ui(在 did() 方法中)。

当用户触发(单击某个项目)某些事件时,这可以正常工作,但如果发生很多事件,则效果不佳。但发生这种情况,所以我需要取消所有当前正在运行和计划的工作人员。问题是支持 ThreadPoolExecutor 的队列不知道 SwingWorker 取消过程(至少看起来是这样)。因此,预定的工作人员会被取消,但已经运行的工作人员不会被取消。

所以我添加了一个 <T extends SwingWorker> 类型的并发队列它保存所有工作人员的引用,只要它们没有被取消,并且当新事件到达时,它会对队列中的所有 SwingWorker 调用 .cancel(true) 并将新的 SwingWorker 提交到 ThreadPoolExecutor。

摘要:SwingWorkers 在具有单个线程的 ThreadPoolExecutor 中创建和执行。只有最后提交的工作线程才应该运行。

有没有其他方法可以解决这个问题,或者这样做“可以”吗?

只是好奇……

最佳答案

创建仅执行最后传入的 Runnable 的单线程 ThreadPoolExecutor 的一种方法是子类化合适的队列类并重写所有添加方法以在添加新的 runnable 之前清除队列。然后将该队列设置为 ThreadPoolExecutor 的工作队列。

关于java - 使用 ThreadPoolExecutor 取消 SwingWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1008258/

相关文章:

java - 不可见的 JRadioButtons

java - 格式化用于显示文件系统树的 JTree 上的标签

java - JSP 打印数组列表中的数据

java - Talend > tFileUnarchive 上的 NullPointerException

java - 在java中将任何文件转换为二进制

c# - 执行异步 RIA 服务调用时回调在哪个线程上执行?

java - 带有 JCombobox 编辑器的 JTable : handle mouse clicks

java - 我使用计时器无缘无故地陷入了 for 循环

c++ - Boost 文件系统与 c++11 线程不兼容

java - 对于同时运行的 2 个线程来说,多少 sleep 时间比较合适