能够获得Future <t>对象</t>的进展

时间:2010-02-16 19:47:54

标签: java concurrency future progress swingworker

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

这引出了以下问题:

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

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

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

public interface CanReportProgress {
    public short progress();
}

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

答案 2 :(得分:2)

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