无法将 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
.
在 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
.