为SwingWorker添加超时功能

3

我很快就要向我的应用程序实现一些功能,根据用户指定的时间长度来超时swing worker。

我想知道是否可以扩展swingworker类并在其中添加自己的超时倒计时,例如我可以覆盖dowork方法,调用startCountdown(),然后调用super.dowork,然后不断检查是否已经超时?

我想知道是否有比这种方法更好的解决方案?谢谢

2个回答

5

SwingWorker的javadocs建议如下:

因为SwingWorker实现了Runnable,所以可以将SwingWorker提交给Executor进行执行。

这将是您想要的超时功能的简单解决方案。

将您的SwingWorker提交给ExecutorService#submit。在生成的Future<?>上,您可以通过实现例如10秒的超时来完成。

Future<?> f = service.submit(mySwingWorker);
try {
    f.get(10, TimeUnit.SECONDS);
} catch (ExecutionException ex) {
    /* SwingWorker threw an Exception */
} catch (TimeoutException ex) {
    /* SwingWorker timed out */
} catch (InterruptedException ex) {
    /* Thread got interrupted */
} catch (CancellationException ex) {
    /* would only be thrown in case you
       call #cancel on your future */
}

2

使用Swing计时器

如果时间到了,计时器会停止。在此之前取消计时器即可停止它。


以防万一有人发现,我使用以下解决方案来解决问题:https://blogs.oracle.com/swinger/entry/swingworker_timing_out_slow_ones - Biscuit128
重复的问题,更好的答案在https://dev59.com/KVrUa4cB1Zd3GeqPhjVl。 - seinecle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接