无法将 Executors.newSingleThreadExecutor() 的结果转换为 ThreadPoolExecutor

Can't cast result of Executors.newSingleThreadExecutor() to ThreadPoolExecutor

ThreadPoolExecutor 文档 (here) 上,它说使用执行器 class 创建公共线程,我只想有一个线程,所以我使用 Executors.newSingleThreadExecutor 并将其转换为 ThreadPoolExecutor,正如我在其他示例中看到的那样,但这会引发 java.lang.ClassCastException。 这是我用它复制的最小化代码。

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class Test {
    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors.newSingleThreadExecutor();
    }
}

一般来说,在做出这样的期望之前,我总是会寻找某种合同定义。文档没有明确说明 Executors.newSingleThreadExecutor() 将 return ThreadPoolExecutor 类型对象。 此外,这种实施(没有合同)将来可能会发生变化。

在这种情况下 newSingleThreadExecutor() returns a ExecutorService 下面是 ThreadPoolExecutor 但包裹在 FinalizableDelegatedExecutorService。这个 class 或多或少是 ThreadPoolExecutor 的兄弟,因此不能转换为它。 我想这样做是为了:

the returned executor is guaranteed not to be reconfigurable to use additional threads

根据您想要实现的目标,您应该考虑:
- 使用来自 newSingleThreadExecutor()ExecutorService return 而不是 ThreadPoolExecutor;
- 使用 newFixedThreadPool(1) 得到 ThreadPoolExecutor.