当前位置:   article > 正文

线程池的操作,包括提交任务和执行线程_线程池提交任务

线程池提交任务

线程池的操作,包括提交任务和执行线程。以下是核心内容的整理:

### 文件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任务的方法

  1. public static Future<?> submit(ThreadPoolKeyType poolKey, Callable<?> callable) {
  2.     LOGGER.info("get submit thread from pool, poolKey: {}, threadClassName: {}", poolKey, callable.getClass().getSimpleName());
  3.     if (POOL_MAP.get(poolKey) != null) {
  4.         return ((ExecutorService) POOL_MAP.get(poolKey)).submit(callable);
  5.     } else {
  6.         LOGGER.warn("there is no thread pool match: {}, use system pool instead!", poolKey);
  7.         return ((ExecutorService) POOL_MAP.get(ThreadPooLKeyCenterEnum.COMMON)).submit(callable);
  8.     }
  9. }

// 执行Runnable任务的方法

  1. public static void executeThread(ThreadPoolKeyType poolKey, Runnable runnable) {
  2.     LOGGER.info("get submit thread from pool, poolKey: {}, threadClassName: {}", poolKey, runnable.getClass().getSimpleName());
  3.     if (POOL_MAP.get(poolKey) != null) {
  4.         ((ExecutorService) POOL_MAP.get(poolKey)).execute(runnable);
  5.     } else {
  6.         LOGGER.warn("there is no thread pool match: {}, use system pool instead!", poolKey);
  7.         ((ExecutorService) POOL_MAP.get(ThreadPoolKeyCenterEnum.COMMON)).execute(runnable);
  8.     }
  9. }

// 默认线程池的创建和存储
POOL_MAP.put(ThreadPooLKeyCenterEnum.COMMON, Executors.newFixedThreadPool(/* 线程数 */, new SimpleThreadFactory(ThreadPooLKeyCenterEnum.COMMON.name())));
// ... 其他线程池的创建和存储逻辑
```

这些代码片段展示了如何根据不同的`poolKey`提交和执行任务,以及如何处理找不到对应线程池的情况。通过这种方式,可以灵活地管理和使用多个线程池。
 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号