ThreadPoolExecutor 自定义5个核心线程
时间: 2023-08-03 10:04:54 浏览: 136
您可以通过以下方式自定义 ThreadPoolExecutor 的核心线程数为 5:
```java
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // 核心线程数
Integer.MAX_VALUE, // 最大线程数
60L, // 空闲线程存活时间
TimeUnit.SECONDS, // 存活时间单位
new LinkedBlockingQueue<Runnable>() // 任务队列
);
```
在上述代码中,将核心线程数设置为 5,最大线程数设置为 Integer.MAX_VALUE(表示可以无限创建线程),空闲线程存活时间设置为 60 秒,存活时间单位为秒,并使用 LinkedBlockingQueue 作为任务队列。
这样创建的 ThreadPoolExecutor 实例将会有 5 个核心线程,并且可以自动根据任务数量创建更多的线程。当任务数量超过核心线程数时,多余的任务会被放入任务队列中等待执行。
相关问题
ThreadPoolExecutor的七个核心参数及详解
Java ThreadPoolExecutor的七个核心参数及详解如下:
1. corePoolSize:线程池中的核心线程数,即在没有任务需要执行时线程池的大小。当有任务需要执行时,线程池会自动扩容,直到达到maximumPoolSize。
2. maximumPoolSize:线程池中允许的最大线程数。当workQueue已满时,线程池会自动扩容,直到达到maximumPoolSize。
3. keepAliveTime:线程池中的非核心线程空闲时的存活时间。当线程池中的线程数大于corePoolSize时,如果这些线程空闲时间超过keepAliveTime,则这些线程会被销毁,直到线程池中的线程数不大于corePoolSize。
4. unit:keepAliveTime的时间单位。
5. workQueue:用于存放等待执行的任务的阻塞队列。常用的有ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue等。
6. threadFactory:用于创建新线程的工厂类。可以自定义线程的名称、优先级等属性。
7. handler:当线程池中的线程数达到maximumPoolSize并且workQueue已满时,新提交的任务会交给handler来处理。常用的有ThreadPoolExecutor.AbortPolicy、ThreadPoolExecutor.CallerRunsPolicy、ThreadPoolExecutor.DiscardOldestPolicy、ThreadPoolExecutor.DiscardPolicy。
java 基于ThreadPoolExecutor的自定义配置类
### 创建基于 `ThreadPoolExecutor` 的自定义配置类
为了更好地管理和利用线程池资源,在实际项目中通常会创建一个基于 `ThreadPoolExecutor` 的自定义配置类来封装线程池的初始化逻辑。下面是一个简单的例子展示如何做到这一点。
#### 定义自定义线程工厂
首先,可以通过继承 `DefaultThreadFactory` 或者实现 `ThreadFactory` 接口来自定义线程名称前缀等属性:
```java
public class NamedThreadFactory implements ThreadFactory {
private final AtomicInteger poolNumber = new AtomicInteger(1);
private final String namePrefix;
public NamedThreadFactory(String prefix) {
this.namePrefix = prefix;
}
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r, namePrefix + "-thread-" + poolNumber.getAndIncrement());
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}
```
此部分代码实现了带有特定命名规则的新建线程功能[^3]。
#### 实现自定义线程池配置类
接着构建具体的线程池配置类,这里假设命名为 `CustomThreadPoolConfig`:
```java
import java.util.concurrent.*;
public class CustomThreadPoolConfig {
/**
* 获取定制化的 ThreadPoolExecutor.
*/
public static ExecutorService getCustomizedThreadPool(){
int corePoolSize = Runtime.getRuntime().availableProcessors(); // 核心线程数量设为CPU核数
int maximumPoolSize = corePoolSize << 1; // 最大线程数量为核心线程两倍
long keepAliveTime = 60L; // 空闲线程保持时间为60秒
BlockingQueue<Runnable> workQueue = new LinkedBlockingDeque<>(10); // 使用有界队列存储待执行的任务
RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy(); // 设置拒绝策略为调用方自己运行被拒任务
return new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
TimeUnit.SECONDS,
workQueue,
new NamedThreadFactory("custom-thread-pool"), // 应用了上面定义好的线程工厂
handler // 处理超出容量的任务
);
}
// 关闭线程池的方法也可以在此处加入...
}
```
上述代码片段展示了如何根据具体的应用场景调整 `corePoolSize`, `maximumPoolSize`, `keepAliveTime` 和其他参数,并选择了合适的阻塞队列以及当提交给线程池的任务过多时采取何种措施(即拒绝策略)。这使得开发者能够更精细地控制应用程序中的并发行为并提高性能效率[^1]。
阅读全文
相关推荐
















