14

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

这就引出了以下问题:

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

4

3 回答 3

5

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

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

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

于 2010-02-16T20:08:45.257 回答
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

于 2010-02-17T08:36:07.993 回答
2

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

于 2011-05-26T12:37:44.783 回答