线程池的操作,包括提交任务和执行线程。以下是核心内容的整理:
### 文件1:提交Callable任务
#### 类和方法:
- 一个静态方法`submit`用于提交`Callable`任务到线程池。
#### 方法重载:
1. `public static Future submit(Callable<?> callable)`:使用通用线程池提交`Callable`任务。
2. `public static Future submit(ThreadPoolKeyType poolKey, Callable<?> callable)`:根据提供的`poolKey`提交`Callable`任务。
#### 日志记录:
- 在提交任务前,记录日志,包括线程池键(`poolKey`)和任务类名。
#### 线程池映射:
- 使用`POOL_MAP`存储线程池,根据`poolKey`获取对应的`ExecutorService`。
#### 线程池创建:
- 如果`POOL_MAP`中没有与`poolKey`对应的线程池,使用系统默认线程池。
#### 默认线程池:
- 使用`SimpleThreadFactory`创建具有固定线程数的线程池,并将其添加到`POOL_MAP`。
### 文件2:执行Runnable任务
#### 类和方法:
- 一个静态方法`executeThread`用于执行`Runnable`任务。
#### 方法重载:
1. `public static void executeThread(Runnable runnable)`:使用通用线程池执行`Runnable`任务。
2. `public static void executeThread(ThreadPoolKeyType poolKey, Runnable runnable)`:根据提供的`poolKey`执行`Runnable`任务。
#### 日志记录:
- 在执行任务前,记录日志,包括线程池键(`poolKey`)和任务类名。
#### 线程池获取和执行:
- 尝试从`POOL_MAP`获取线程池并执行`Runnable`。
- 如果没有找到对应的线程池,使用系统默认线程池。
#### 默认线程池使用:
- 如果指定的`poolKey`没有对应的线程池,记录警告日志并使用通用线程池执行任务。
### 共同点:
- 两个文件都涉及线程池的操作,使用`ThreadPoolKeyType`作为线程池的键。
- 都实现了根据`poolKey`获取线程池的逻辑,如果找不到则使用默认线程池。
- 都进行了日志记录,记录关键信息以便于调试和监控。
### 代码片段示例(结合两个文件):
```java
// 提交Callable任务的方法
public static Future<?> submit(ThreadPoolKeyType poolKey, Callable<?> callable) {
LOGGER.info("get submit thread from pool, poolKey: {}, threadClassName: {}", poolKey, callable.getClass().getSimpleName());
if (POOL_MAP.get(poolKey) != null) {
return ((ExecutorService) POOL_MAP.get(poolKey)).submit(callable);
} else {
LOGGER.warn("there is no thread pool match: {}, use system pool instead!", poolKey);
return ((ExecutorService) POOL_MAP.get(ThreadPooLKeyCenterEnum.COMMON)).submit(callable);
}
}
// 执行Runnable任务的方法
public static void executeThread(ThreadPoolKeyType poolKey, Runnable runnable) {
LOGGER.info("get submit thread from pool, poolKey: {}, threadClassName: {}", poolKey, runnable.getClass().getSimpleName());
if (POOL_MAP.get(poolKey) != null) {
((ExecutorService) POOL_MAP.get(poolKey)).execute(runnable);
} else {
LOGGER.warn("there is no thread pool match: {}, use system pool instead!", poolKey);
((ExecutorService) POOL_MAP.get(ThreadPoolKeyCenterEnum.COMMON)).execute(runnable);
}
}
// 默认线程池的创建和存储
POOL_MAP.put(ThreadPooLKeyCenterEnum.COMMON, Executors.newFixedThreadPool(/* 线程数 */, new SimpleThreadFactory(ThreadPooLKeyCenterEnum.COMMON.name())));
// ... 其他线程池的创建和存储逻辑
```
这些代码片段展示了如何根据不同的`poolKey`提交和执行任务,以及如何处理找不到对应线程池的情况。通过这种方式,可以灵活地管理和使用多个线程池。