package com.alex.examples.controller.threadPool;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 线程池管理类(饿汉模式加载:饿汉式是在类加载的时候就创建了对象实例)
*/
@Component //线程池组件化,系统启动就加载
public class ThreadPoolUtil {
private static ThreadPoolExecutor poolExecutor = null;
//系统启动完后,有且只执行一次
@PostConstruct
public void initCreate() {
System.out.println("初始化创建线程池");
init();
}
/**
* 实例化线程池
*/
private static void init() {
poolExecutor = new ThreadPoolExecutor(
8, 32, 60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(128), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
}
/**
* 获取线程池
*
* @return
*/
public static ThreadPoolExecutor getThreadPool() {
if (null == poolExecutor) {
throw new RuntimeException("线程池有问题!!!!");
}
return poolExecutor;
}
/**
* 关闭线程池(待正在执行的线程执行完后再停止,不包含等待中的线程)
*/
public static void shutdown() {
if (null != poolExecutor && !poolExecutor.isShutdown()) {
poolExecutor.shutdown();
}
}
/**
* 关闭线程池(立即停止)
*/
public static void shutdownNow() {
if (null != poolExecutor && !poolExecutor.isShutdown()) {
poolExecutor.shutdownNow();
}
}
/**
* 刷新线程池
* 1.shutdown:将线程池的状态设置为SHUTWDOWN状态,正在执行的任务会继续执行下去,没有被执行的则中断。
* 2.shutdownNow:将线程池的状态设置为STOP,正在执行的任务则被停止,没被执行任务的则返回。
*
* @param shutdownType:1和2
*/
public static void refresh(Integer shutdownType) {
if (null != poolExecutor && !poolExecutor.isShutdown()) {
if (null == shutdownType || shutdownType.equals(1)) {
poolExecutor.shutdown();
} else {
poolExecutor.shutdownNow();
}
}
init(); //实例化
}
}
private static void sendEmail(String userName) {
ThreadPoolExecutor pool = ThreadPoolUtil.getThreadPool();
pool.execute(() -> {
System.out.println("给" + userName + "发送邮件通知");
});
}