JAVA 线程池(四)异常捕获
2018-04-13 本文已影响6人
M_ENG
重写ThreadPoolExecutor的afterExecute方法 、如果是定时器线程池就用TryCatch吧
线程开始执行之前会调用 beforeExecute
线程结束执行之后会调用 afterExecute
/**
* 线程池工具类
*
* @author MENG
* @version 2018/3/21
* @see
*/
public class ThreadPoolUtil
{
public static ExecutorService getWriteDataToRedisFixedThreadPool()
{
return WriteRedisFixedThreadPool.instance;
}
/**
* 实例会复用 固定数量的线程 处理一个 共享的无边界队列
*
* 最多有 8 个线程会处于活动状态执行任务
*
* Runtime.getRuntime().availableProcessors() = cpu核数
*
* IO密集型=2Ncpu
*
* 计算密集型=Ncpu+1
*
* 数据写入Redis 线程池
*/
private static class WriteRedisFixedThreadPool
{
//FixedThreadPool
private static final ExecutorService instance = new ThreadPoolExecutor(8, 8,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingDeque<>()){
protected void afterExecute(Runnable r, Throwable t)
{
super.afterExecute(r, t);
printException(r);
}
};
/**
* 多线程打印异常
*
* @param r
*/
private static void printException(Runnable r)
{
if (r instanceof Future<?>)
{
try {
Future<?> future = (Future<?>) r;
if (future.isDone())
future.get();
}
catch (ExecutionException | InterruptedException ee)
{
logger.error("数据写入Redis执行异常!!!", ee);
}
}
}
}