java - 在不同线程中使用相同的 ExecutorService 实例是线程安全的吗?
问题描述
例如,我通过ExecutorService 实例执行可运行块,并且该可运行块通过相同的 ExecutorService 实例执行一些异步代码。所以我的代码看起来像:
final ExecutorService eService = Executors.newFixedThreadPool(nThreads);
eService.execute(new Runnable() {
public void run() {
eService.execute(new Runnable() {
public void run() {
System.out.println("Successfully created");
}
});
}
});
- 这段代码线程安全吗,因为 ExecutorService 没有状态?
在我的真实应用程序中,我有一些线程在它们内部创建了新线程,我想使用一个具有可配置线程池大小的 ExecutorService 实例(可能是一种不好的做法?)。
- 为不同的线程拥有一个 ExecutorService 实例是一种不好的做法吗?
- 如果是的话,也许有一些替代方案?
解决方案
看起来不错。重用线程而不是产生新线程(这很昂贵)是一种很好的做法,并且这种线程共享的一种可能实现可以是使用ExecutorService
请记住,它适用于您提到的代码,如果您尝试等待预定操作的结果,它可能会中断。当所有线程(来自池)将等待等待空闲线程(在该池中)执行它的操作结果时,这可能导致明显的死锁。
推荐阅读
- java - 同时运行 Void CompletionStage 但忽略结果
- git - 无法从 Windows 签入 linux 格式文件
- html - 为什么在这种情况下我必须使用 !important ?
- reactjs - 如何从 React Native 中的子组件更新父组件中的状态?
- bash - 在 Shell 脚本中连接字符串和变量
- android - 运行 android 应用程序问题:E/AndroidRuntime: FATAL EXCEPTION: main
- python - 我们如何将 OHLCV 1 分钟 Pandas Dataframe 重新采样为 5 分钟 Dataframe - 2020 方法?
- javascript - 引导下拉菜单在单击时关闭其容器菜单
- swift - 如何检查用户输入的域(和子域)与我的白名单?
- c - kill() 是否在 C 中立即工作?还是有机会运行下一行?