作者热门文章
- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
import java.util.concurrent.*;
/**
* @description: 自定义过线程池代码示例
* @author: xz
*/
public class MyThreadPoolDemo1 {
public static void main(String[] args) {
/**
* 通过ThreadPoolExecutor创建线程池
*
* 参数1:corePoolSize 核心线程数 定义为2
* 参数2:maximumPoolSize 最大线程数 定义为5
* 参数3:keepAliveTime 多余的空闲线程存活时间 定义为1
* 参数4:unit keepAliveTime的单位 定义为秒
* 参数5:workQueue 任务队列 定义为3
* 参数6:threadFactory 线程工厂
* 参数7:handler 拒绝策略 使用默认策略 直接抛出RejectedException异常阻止系统正常运行
* */
ExecutorService threadPool = new ThreadPoolExecutor(
2,
5,
1L,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
try {
//模拟16个用户办理业务,每个用户就是一个来自外部的请求线程
for(int i=1;i<=16;i++){
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+"");
});
}
}catch (Exception e){
e.printStackTrace();
}finally {
threadPool.shutdown();
}
}
}
import java.util.concurrent.*;
/**
* @description: 自定义过线程池代码示例
* @author: xz
*/
public class MyThreadPoolDemo1 {
public static void main(String[] args) {
/**
* 通过ThreadPoolExecutor创建线程池
*
* 参数1:corePoolSize 核心线程数 定义为2
* 参数2:maximumPoolSize 最大线程数 定义为5
* 参数3:keepAliveTime 多余的空闲线程存活时间 定义为1
* 参数4:unit keepAliveTime的单位 定义为秒
* 参数5:workQueue 任务队列 定义为3
* 参数6:threadFactory 线程工厂
* 参数7:handler 拒绝策略 使用CallerRunsPolicy拒绝策略 既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者
* */
ExecutorService threadPool = new ThreadPoolExecutor(
2,
5,
1L,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
try {
//模拟16个用户办理业务,每个用户就是一个来自外部的请求线程
for(int i=1;i<=16;i++){
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+"");
});
}
}catch (Exception e){
e.printStackTrace();
}finally {
threadPool.shutdown();
}
}
}
import java.util.concurrent.*;
/**
* @description: 自定义过线程池代码示例
* @author: xz
*/
public class MyThreadPoolDemo1 {
public static void main(String[] args) {
/**
* 通过ThreadPoolExecutor创建线程池
*
* 参数1:corePoolSize 核心线程数 定义为2
* 参数2:maximumPoolSize 最大线程数 定义为5
* 参数3:keepAliveTime 多余的空闲线程存活时间 定义为1
* 参数4:unit keepAliveTime的单位 定义为秒
* 参数5:workQueue 任务队列 定义为3
* 参数6:threadFactory 线程工厂
* 参数7:handler 拒绝策略 使用DiscardOldestPolicy拒绝策略 抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交
* */
ExecutorService threadPool = new ThreadPoolExecutor(
2,
5,
1L,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardOldestPolicy());
try {
//模拟16个用户办理业务,每个用户就是一个来自外部的请求线程
for(int i=1;i<=16;i++){
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+"");
});
}
}catch (Exception e){
e.printStackTrace();
}finally {
threadPool.shutdown();
}
}
}
一般的公式:CPU核数+1个线程的线程池。
比如:CPU核数 * 2
参考公式:CPU / 1-阻塞系数(阻塞系数在0.8~0.9之间)
比如8核的CPU:8/1 -0.9 =80个线程数
我是一名优秀的程序员,十分优秀!