public class ThreadTemplate {
/**监控线程池*/
private final static ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(
1,
new BasicThreadFactory.Builder()
.namingPattern(
"监控线程-%d")
.daemon(true)
.build());
/**业务线程池*/
private final static ThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(
5,
10,
300,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(
1000),
new BasicThreadFactory.Builder()
.namingPattern(
"业务线程-%d")
.build(),
new ThreadPoolExecutor.AbortPolicy());
static {
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
log.info( (
String.format("业务线程池活动线程=%s,阻塞队列=%s",
THREAD_POOL_EXECUTOR.getActiveCount(), THREAD_POOL_EXECUTOR.getQueue().size())));
}
}, 0, 3, TimeUnit.SECONDS);
}
}
在我们项目中监控使用 ScheduledThreadPoolExecutor 定时监控业务线程池,定时打印线程状态,可以根据业务需要设置定时间隔,业务线程池的拒绝策略使用AbortPolicy抛出RejectedExecutionException,在业务代码中一定要catch这个异常,将业务参数打印出来,人工做后续的补偿,并且及时调整线程池参数