能够获得未来<T>对象的进度

关于java.util.concurrent包和Future接口,我注意到(除非我弄错了)启动冗长任务并能够查询进度的能力仅来自SwingWorker实现类。

这就引出了以下问题:

有没有办法,在非GUI,非Swing应用程序(映像控制台应用程序)中在后台启动冗长的任务并允许其他线程检查进度?在我看来,没有理由将此功能限制在 swing/GUI 应用程序中。否则,唯一可用的选项,我看到的方式,是通过ExecutorService::submit返回一个Future对象。但是,基本 Future 接口不允许监视进度。


答案 1

显然,Future 对象只适合于阻止然后接收结果。

您提交的 Runnable 或 Callable 对象必须知道如何提供此进度(完成百分比、尝试次数、状态(枚举?)等),并将其作为对对象本身的 API 调用提供,或者发布在某个查找资源中(如有必要,在内存映射或数据库中)。为了简单起见,我倾向于喜欢对象本身,特别是因为您很可能需要一个句柄(id)来查找对象或对对象本身的引用。

这确实意味着您有 3 个线程在运行。1 表示实际工作,1 表示在等待结果时被阻止,1 表示监视线程。最后一个可以根据您的要求共享。


答案 2

在我的情况下,我传递了一个哈希集,其中包含要处理的对象,作为方法的参数,它是在调用类中创建的实例变量。当异步方法在处理后删除对象时,可以检索调用方法中剩余的 Map 的大小。一般来说,通过引用传递对象可以解决问题。


推荐