Как ThreadPoolExecutor, созданный с использованием конструктора с BlockingQueue <Runnable>в качестве аргумента, ставит в очередь Callables? - PullRequest
1 голос
/ 10 марта 2019

Конструктор для 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?
Как эта задача будет поставлена ​​в очередь?

1 Ответ

1 голос
/ 10 марта 2019

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

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

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

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

...