gpt4 book ai didi

java - java中取消并重用(SwingWorker)线程

转载 作者:行者123 更新时间:2023-12-01 11:23:06 24 4
gpt4 key购买 nike

我继承了一个项目,我们在该项目中使用 java 并在图像上绘制内容。当用户前后移动 slider 以更改图像上边缘的阈值时,它会运行一种检测此情况的方法。这大约需要 200-300 毫秒,因此它会锁定 UI 一段时间,但当用户移动 slider 时,它会不断锁定界面。

他们似乎已将其移至后台线程,但每次 slider 移动时都会创建一个新线程。因此,当用户将 slider 移动一英寸时,它会产生大约 80 个线程,并且整个系统会锁定几秒钟。

我不知道如何解决这个问题。这是一个回发到 UI 的 swingworker 线程。我尝试取消(),然后再次执行()线程,但似乎这是不可能的。当我可以取消旧的线程时(因为我们不需要旧的预览),我不想要很多线程,所以我认为只有一个可以工作。

这是工作线程。

// WORKER
private class ThresholdWorker extends SwingWorker<BufferedImage, Object> {
// long-running code to be run in a worker thread
@Override
public BufferedImage doInBackground() throws Exception {
@SuppressWarnings("static-access")
BufferedImage img = new BufferedImage(imagePanel.rect_width, imagePanel.rect_height, BufferedImage.TYPE_3BYTE_BGR);
img = imagePanel.detectEdges();
return img;
} // end method doInBackground

// code to run on the event dispatch thread when doInBackground returns
@Override
protected void done() {
try {
@SuppressWarnings("static-access")
BufferedImage Img = new BufferedImage(imagePanel.rect_width, imagePanel.rect_height, BufferedImage.TYPE_3BYTE_BGR);
Img = get();
imagePanel.standardRectEdgesDilated = Img;
imagePanel.repaint();
} catch (InterruptedException ignore) {
} catch (ExecutionException ex) {
IdentiFrog.LOGGER.writeException(ex);
System.err.println("Error encountered while performing calculation.");
}
}
}

这是单线程执行器服务的任务吗?我似乎找不到很多有关停止任务但继续使用同一线程的信息(例如我认为的状态模式)。如果可能的话,我不想启动一堆线程。

最佳答案

问题可能是 SwingWorker 中完成的工作是不可中断的,即在 doInBackground() 中未检查 Thread.interrupted() 。因此,即使您取消了工作线程,它实际上并没有停止,而是仍然继续产生结果(最终被丢弃)。

可能解决此问题的一种方法是修改代码(很可能是在 detectorEdges() 内部)以及时响应中断。

如果这不是一个可行的选择,请改变方法。跟踪是否有活跃的 worker 在那里;如果是,则向其提交新的参数集,否则启动一个。然后,工作人员本身需要修改为仅在生成与当前参数匹配的结果后才退出 doInBackground()。这种方法可能更容易手动实现,即不使用 SwingWorker。

关于java - java中取消并重用(SwingWorker)线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31034129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com