JAVA 线程池(四)异常捕获

重写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 线程】 线程 进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者...
    Rtia阅读 2,777评论 2 20
  • 为什么使用线程池 当我们在使用线程时,如果每次需要一个线程时都去创建一个线程,这样实现起来很简单,但是会有一个问题...
    闽越布衣阅读 4,308评论 10 45
  • 一.Java中的ThreadPoolExecutor类 java.uitl.concurrent.ThreadPo...
    谁在烽烟彼岸阅读 657评论 0 0
  • /* 产品家实战营第三期 Week06 作业 2017/09/25 */
    Vujuer阅读 854评论 0 3
  • 昨晚大宝说,作业很多,累死了,自己写了作文让我看,认真的看完了,发现她写的是不错的,可能是经过老师知道修改过来的吧...
    平凡精灵阅读 295评论 0 0