美文网首页Java those things我爱编程
JAVA 线程池(四)异常捕获

JAVA 线程池(四)异常捕获

作者: M_ENG | 来源:发表于2018-04-13 18:07 被阅读6次

    重写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);
                }
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:JAVA 线程池(四)异常捕获

        本文链接:https://www.haomeiwen.com/subject/nschkftx.html