我有一个像
这样的大线程池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();
}
换句话说,我在执行程序中调用执行程序。它安全稳定吗?或者我可以通过超时以其他方式取消我的任务吗?
答案 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);