小编Dre*_*rew的帖子

添加/扩展由ListeningExecutorService创建的Future的行为

最终的目标是要额外添加行为ListenableFuture小号基础上的类型Callable/ Runnable参数.我想为每个Future方法添加额外的行为.(示例用例可以在AbstractExecutorService的javadoc和Goetz的Java Concurrency in Practice的 7.1.7节中找到)

我有一个现有的ExecutorService来覆盖newTaskFor.它测试参数的类型并创建一个子类FutureTask.这自然支持submit以及invokeAnyinvokeAll.

我如何获得了同样的效果ListenableFuture S按返回的ListeningExecutorService

换句话说,我可以在哪里放这个代码

if (callable instanceof SomeClass) {
   return new FutureTask<T>(callable) {
        public boolean cancel(boolean mayInterruptIfRunning) {
            System.out.println("Canceling Task");
            return super.cancel(mayInterruptIfRunning);
        }
    };
} else {
    return new FutureTask<T>(callable);
}
Run Code Online (Sandbox Code Playgroud)

这样我的客户端就可以执行该println语句

ListeningExecutorService executor = ...;
Collection<Callable> callables = ImmutableSet.of(new SomeClass());
List<Future<?>> futures = executor.invokeAll(callables);
for (Future<?> …
Run Code Online (Sandbox Code Playgroud)

java guava

9
推荐指数
1
解决办法
4221
查看次数

取消并完成定期任务时的回调

我有两个任务:第一个任务(work)重新出现,第二个任务(cleanup)释放一些资源.该cleanup任务应该正好运行一次重现的后work任务已经完成,并且不会再次运行.

我的第一直觉是这样的:

ScheduledExecutorService service = ...;
ScheduledFuture<?> future = service.scheduleAtFixedRate(work, ...);

// other stuff happens

future.cancel(false);
cleanup.run();
Run Code Online (Sandbox Code Playgroud)

这里的问题是cancel()立即返回.因此,如果work碰巧正在运行,那么cleanup将重叠它.

理想情况下,我会使用类似番石榴的东西Futures.addCallback(ListenableFuture future, FutureCallback callback).(番石榴15可能有类似的东西).

在此期间,如何在future取消并且 work不再运行时触发回调?

java

5
推荐指数
1
解决办法
1450
查看次数

标签 统计

java ×2

guava ×1