【发布时间】:2010-11-03 17:48:44
【问题描述】:
我正在使用线程池大小为 1 的 ThreadPoolExecutor 来顺序执行摇摆工作人员。我遇到了一个特殊情况,即一个事件到达,它创建了一个执行一些客户端-服务器通信的 swing worker,然后更新 ui(在 done() 方法中)。
当用户触发(点击某个项目)某些事件时,这可以正常工作,但如果发生许多事件则不会。但这发生了,所以我需要取消所有当前正在运行和计划的工作人员。问题是支持 ThreadPoolExecutor 的队列不知道 SwingWorker 取消过程(至少看起来是这样)。所以预定的工人会被取消,但已经在运行的工人不会。
所以我添加了一个<T extends SwingWorker> 类型的并发队列,它保存所有工作人员的引用,只要它们没有被取消,并且当新事件到达时,它会在队列中的所有 SwingWorkers 上调用 .cancel(true) 并提交新的 SwingWorker 到 ThreadPoolExecutor。
总结:SwingWorkers 是在具有单个线程的 ThreadPoolExecutor 中创建和执行的。只有最后提交的工作人员才应该运行。
有没有其他方法可以解决这个问题,或者这样做“可以”吗?
只是好奇……
【问题讨论】:
-
有效吗?如果它没有坏,请不要修复它(或者修复它直到它坏了,哈哈)
-
是的,它有效。但是编写并发代码很难。我只是想知道我的任务是否存在任何概念。
标签: java multithreading swing threadpool