Java those things我爱编程

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);
            }
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读