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

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

### 文件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`提交和执行任务,以及如何处理找不到对应线程池的情况。通过这种方式,可以灵活地管理和使用多个线程池。
 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值