ThreadPoolExecutor :: afterExecute会在异常的情况下返回runnable吗?

时间:2017-04-20 13:49:33

标签: java threadpool threadpoolexecutor

ThreadPoolExecutor的Javadoc定义了(https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html#afterExecute(java.lang.Runnable,%20java.lang.Throwable)

protected void afterExecute(Runnable r, Throwable t)

如果发生异常,是否会将初始runnable传递给函数?

1 个答案:

答案 0 :(得分:1)

退回。这很容易检查 - 考虑基于doc的代码:

public class MainApp {

    public static void main(String[] args) {
        testme();
    }

    public static void testme() {
        ThreadPoolExecutor myown = new ExtendedExecutor(2,4,10, TimeUnit.DAYS.SECONDS, new ArrayBlockingQueue<Runnable>(2));

        myown.execute(() -> {
                throw new RuntimeException("Something went wrong");
  //            System.out.println("Hey there");
        }
    );
}


static class ExtendedExecutor extends ThreadPoolExecutor {

    public ExtendedExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    }

    protected void afterExecute(Runnable r, Throwable t) {
        super.afterExecute(r, t);
        if (t == null && r instanceof Future<?>) {
            try {
                Object result = ((Future<?>) r).get();
            } catch (CancellationException ce) {
                t = ce;
            } catch (ExecutionException ee) {
                t = ee.getCause();
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt(); // ignore/reset
            }
        }
        if (t != null) {
            System.out.println("We've got error");
            System.out.println(r==null?"null":"not null");
        }
    }
}