能够在Future 对象上获得进展

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

这引出了以下问题:

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

显然,Future对象只对阻塞然后接收结果有好处。

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

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

在我的例子中,我传递了一个HashSet,其中要处理的Objects作为Method的参数,它在调用Class中被创建为实例变量。 当异步方法在处理后删除对象时,可以检索调用方法中剩余的Map的大小。 我总的来说,通过参考对象来解决问题。

我希望有一个标准的并发框架方法来保持对长时间运行任务的进度的更新,而不需要客户端程序担心编排和正确同步所有内容。 在我看来,人们可以理解Future接口的扩展版本,它将支持: public short progress(); 除了通常的isDone()get()方法。 显然, progress()的实现需要直接轮询对象,因此Future可能需要指定为Future ,其中CanReportProgress是以下接口:

 public interface CanReportProgress { public short progress(); } 

这引出了一个问题,即为什么人们会费心去通过Future对象而不是调用对象本身来获得进度。 我不知道。 我要多考虑一下。 可以说它更接近于当前的契约/语义,在Callable ExecutorService::submit / execute之后,客户端程序员本身不再访问Callable对象。