Как ThreadPoolExecutor, созданный с помощью конструктора с BlockingQueue‹Runnable› в качестве аргумента, ставит в очередь Callables?

Конструктор для ThreadPoolExecutor имеет аргумент типа для BlockingQueue как Runnable.
Предположим, у меня есть ThreadPoolExecutor, объявленный следующим образом.

ThreadPoolExecutor customThreadPool = new ThreadPoolExecutor(numberOfAvailableProcessors,
                                numberOfAvailableProcessors, 2L,
                                TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<>(),
                                Executors.defaultThreadFactory(),
                                new RejectedExecutionHandler() {
                                    @Override
                                    public void rejectedExecution(Runnable r, ThreadPoolExecutor threadPoolExecutor) {
                                        // Do something here to handle it
                                    }
                                });  

Мой вопрос в том, что когда делать что-то вроде:

customThreadPool.submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    return Math.toIntExact(Thread.currentThread().getId());
                }
            })  

Как ThreadPool справляется с этим, несмотря на то, что я указал аргумент типа Queue как Runnable?
Как эта задача будет поставлена ​​в очередь?


person Shankha057    schedule 09.03.2019    source источник


Ответы (1)


Это потому, что он оборачивает вашу Callable задачу как RunnableFuture перед постановкой в ​​очередь или выполнением.

Этот RunnableFuture реализует интерфейс Runnable (в дополнение к Future).

Таким образом, все вызываемые объекты могут быть поставлены в очередь и выполнены без каких-либо проблем.

Взгляните на источник AbstractExecutorService для получения дополнительной информации.

person Laksitha Ranasingha    schedule 10.03.2019