Java Executors通过内部执行程序超时取消作业

时间:2016-04-18 16:21:33

标签: java multithreading

我有一个像

这样的大线程池
ThreadPoolExecutor pool = new ThreadPoolExecutor(cores, 50, 30L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3000));

我想在那里提交一份任务。但我根本不想打电话给future.get(),我想提交并忘记。

但是,我希望我的任务在某个时间段内被取消。所以我做了以下几点:

public void run(){

FutureTask<WorkerWrapper> task = new FutureTask<>(()->worker.process(tmpArg));
executor.execute(task);
res=task.get(2, TimeUnit.MINUTES);
executor.shutdown();    

}

换句话说,我在执行程序中调用执行程序。它安全稳定吗?或者我可以通过超时以其他方式取消我的任务吗?

2 个答案:

答案 0 :(得分:1)

实现这一目标的唯一真正方法是AFAIK,即拥有第二个ScheduledExecutor。您仍然需要Future的句柄,但只能将其传递给预定的执行者以取消。

Future<WorkedWrapper> task = executor.execute(() -> worker.process(tmpArg));
scheduledExecutor.schedule(() -> task.cancel(true), 2, TimeUnit.MINUTES);

使用CompleteableFuture可能会有一种更流畅的处理方法,但我不是百分之百确定。

答案 1 :(得分:0)

ScheduledThreadPoolExecutor有一个方法,可以安排runnable并获得未来。你可以将它与未来的定时结合起来:

ScheduedThreadPoolExecutor e = ...
Future<T> f = e.submit(new Runnable(){..},new T(){});
Object ignore = f.get(timeout, timeunit);