线程池的常规使用:
消息发送类,线程池调用
public class MessageClientSendMsg {
/**
* 日志记录器
*/
private static final Log LOGGER = new Log(MessageClientSendMsg.class);
/**
* 线程池
*/
private static ExecutorService threadPool;
/**
* trace
*/
private String trace;
/**
* 手机号
*/
private String cellNum;
/**
* 消息实体
*/
private MessageProducerReq messageProducerReq;
static {
threadPool = Executors.newFixedThreadPool(10);//固定个数的线程池
}
/**
* 构造函数
*
* @param trace 请求流水
* @param cellNum 电话号码
* @param messageProducerReq 消息实体
*/
public MessageClientSendMsg(String trace, String cellNum, MessageProducerReq messageProducerReq) {
this.trace = trace;
this.cellNum = cellNum;
this.messageProducerReq = messageProducerReq;
}
/**
* 消息发送
*/
public void sendMsg() {
SendMsgRunable sendMsgRunable = new SendMsgRunable();
threadPool.execute(sendMsgRunable);
}
/**
* 发送消息内部类并处理异常,不能影响主线程的业务
*/
class SendMsgRunable implements Runnable {
@Override
public void run() {
try {
MessageClientProducer msgClintProducer = new MessageClientProducer();
msgClintProducer.sendAsyncWithPartition(trace, cellNum, messageProducerReq);
} catch (Exception e) {
LOGGER.error("消息发送失败!,trace:" + trace);
}
}
}
}
SpringBoot中使用线程池使用@EnableAsync注解和@Async注解
配置线程池:
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
@EnableAsync
public class BeanConfig {
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 设置核心线程数
executor.setCorePoolSize(5);
// 设置最大线程数
executor.setMaxPoolSize(10);
// 设置队列容量
executor.setQueueCapacity(20);
// 设置线程活跃时间(秒)
executor.setKeepAliveSeconds(60);
// 设置默认线程名称
executor.setThreadNamePrefix("hello-");
// 设置拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任务结束后再关闭线程池
executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
}
并发业务:
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class Test {
@Async
public void test(int i){
SimpleDateFormat format=new SimpleDateFormat("HH:mm:ss");
try {
Thread.sleep(10000);
System.out.println("多线程异步执行"+i+" "+Thread.currentThread().getName()+" "+format.format(new Date()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Controller层使用
@GetMapping("/test")
@ResponseBody
public void test(){
for (int i = 0; i < 100; i++) {
test.test(i);
}
}
原文:https://www.cnblogs.com/ZenoLiang/p/12624030.html