线程阻塞未来哪个相应的任务被丢弃会发生什么?

时间:2015-12-31 13:55:58

标签: java multithreading threadpoolexecutor

我使用ExecutorService在线程池上执行一些计算:

@Override
public double predict(IModelInputData<EXTRACTER> modelInputData) throws PredictionFailureException {
    try {
        return threadPool.submit(() -> regressor.predict(modelInputData)).get();
    } catch (InterruptedException|ExecutionException e) {
        throw new PredictionFailureException("Error during prediction", e);
    }
}

使用有界阻塞队列和自定义策略创建了执行程序服务threadPool

private static class DiscardOldestWithWarningPolicy extends ThreadPoolExecutor.DiscardOldestPolicy {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        super.rejectedExecution(r, e);
        LOG.warn("Discarded the oldest prediction task (too many tasks in the queue)");
    }
}

我做了一个测试,以确保实际记录了这个警告,但是我很不确定当相应的任务被丢弃时,threadPool.submit(...).get()上阻塞的线程会发生什么。它看起来像他们被阻止,但这没有多大意义。我希望看到hapenning的行为是一个异常被抛出来打断线程,但我没有看到任何。

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

是的,看起来内置的DiscardOldestPolicy只是丢掉了地板上最老的一个。问题是ThreadPoolExecutor持有Runnable,并且无法知道如何处理它。你可以实现自己的处理程序,它可以对任务做一些有用的事情(对Runnable的类型做出假设)。

类似的东西:

    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        if (!e.isShutdown()) {
            Runnable old = e.getQueue().poll();
            if(old instanceof Future<?>) {
                ((Future<?>)old).cancel(true);
            }
            e.execute(r);
        }
    }