使用 Java 的 SwingWorker 使任务超时
我正在尝试在我的应用程序中实现一个 SwingWorker
类。有没有办法设置 SwingWorker “超时”之后的时间长度?我在想也许会抛出一个我可以捕获然后处理的 OutOfTime
异常。我只是不确定如何实施它。
感谢您的帮助!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
为什么不将您的任务嵌入到 Runnable 中,将其放入新的单线程 ExecutorService,然后对生成的 get()。 0/docs/api/java/util/concurrent/Future.html" rel="nofollow noreferrer">Future 具有适当的超时。这将为您提供超时功能,因为如果作业未及时完成,
get()
将抛出异常。Why not embed your task within a Runnable, drop it into a new single-threaded ExecutorService and then perform a
get()
on the resulting Future with an appropriate timeout. That would give you your timeout functionality, sinceget()
will throw an exception if the job doesn't complete in time.简短的回答是“这很难”,具体取决于您的要求。我强烈建议阅读 Java 并发实践。
您可以做的基本事情是(a)确保 SwingWorker 的 Runnable 是中断友好的,并且(b)设置一个计时器(或使用 Brian 提到的阻塞 get() 调用)来取消您的 Future。
The short answer is "it's hard", depending on what your requirements are. I highly recommend reading Java Concurrency In Practice.
The basic thing you could do would be to (a) make sure your SwingWorker's Runnable is interrupt-friendly, and (b) set a Timer (or use the blocking get() call Brian mentioned) to cancel your Future.
内部类 MySwingWorker 很可能满足您的需要:
}
The inner class MySwingWorker may well do what you need:
}
不使用 SwingWorker 的任何特殊原因。get(long, java.util.concurrent.TimeUnit) ?它将抛出 TimeoutException,您可以在应用程序中轻松处理该异常。
Any particular reason for not using the SwingWorker.get(long, java.util.concurrent.TimeUnit) ? It will throw TimeoutException that you can easily handle in your application.