Java 如果一个线程在一个对应的任务被丢弃的将来阻塞,会发生什么情况?

Java 如果一个线程在一个对应的任务被丢弃的将来阻塞,会发生什么情况?,java,multithreading,threadpoolexecutor,Java,Multithreading,Threadpoolexecutor,我正在使用ExecutorService对线程池执行一些计算: @Override public double predict(IModelInputData<EXTRACTER> modelInputData) throws PredictionFailureException { try { return threadPool.submit(() -> regressor.predict(modelInputData)).get(); } c

我正在使用
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.submit(…).get()
上阻塞的线程会发生什么情况。在我看来,他们似乎一直被封锁,但这没有多大意义。我希望看到hapenning的行为是抛出异常以中断线程,但我没有看到任何异常


我遗漏了什么吗?

是的,看起来内置的丢弃最旧保险单只是把最旧的保险单掉在了地板上。问题是ThreadPoolExecutor持有一个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);
        }
    }
public void rejectedExecution(可运行r、线程池执行器e){
如果(!e.isShutdown()){
Runnable old=e.getQueue().poll();
if(未来的旧实例){
((未来)旧)。取消(真);
}
e、 执行(r);
}
}

是的,这是可能的。然而,API中提供的策略会有这样的缺陷,这听起来很奇怪。我不知道它是否真的阻止了等待丢弃的任务返回的线程。我只是告诉过你,确实如此,你可以看到impl。我的示例基于当前的实现。是的,我也阅读了实现,但它对我来说太令人惊讶了,现在仍然如此。您是否能够运行一个代码来演示这一点?我没有做到这一点,因此我的问题就在这里。写一个代码,演示调用线程被阻塞。但这可能没有必要,你证实了我的想法。干杯:)服务。submit()使异常变浅。这就是为什么你没有得到例外。如果将submit更改为execute,则可以看到差异。
    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);
        }
    }