《java并发编程实践》---第8章 应用线程池

Posted anpeiyong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《java并发编程实践》---第8章 应用线程池相关的知识,希望对你有一定的参考价值。

1、定制线程池的大小

    1.1、线程池的合理大小  取决于  未来提交的任务类型  和  所部署的系统特征;

2、配置ThreadPoolExecutor

    2.1、ThreadPoolExecutor 提供了 一些基本的Executor的实现:

          (由 工具类Executors 提供的newCachedThreadPoolnewFixedThreadPoolnewSingleThreadExecutornewSingleThreadScheduledExecutor 返回)

    2.2、如果 Executors提供的不能满足需求,可以通过ThreadPoolExecutor定制:

        核心线程池大小

          即使没有任务执行,池的大小也等于核心池的大小,直到工作队列充满前,都不会增加新的线程;

        最大线程数

          池内同时活动的线程的上限;

        线程存活时间

          如果一个线程闲置的时间超过了存活时间,并且 池大小  大于  核心线程大小 ,线程池会终止该线程;

        工作队列

          ThreadPoolExecutor提供了BolckingQueue 持有等待执行的任务;

          任务队列有3种:无限队列、有限队列、同步移交 

        拒绝策略

          当任务队列满后,新任务怎么处理?

            jdk提供了4种饱和策略:

                AbortPolicy:

                  默认策略,抛出RejectedExecutionException异常;

                CallerRunsPolicy:

                  既不会抛出异常、也不会丢弃任务,而是 将任务推回,由调用者执行;

                DiscardPolicy:

                  丢弃新任务;

                DiscardOldestPolicy:  

                  丢弃最老的任务

3、扩展ThreadPoolExecutor

    3.1、ThreadPoolExecutor提供了几个钩子函数:

        beforeExecute()

          如果beforeExecute()抛出一个RuntimeException,           任务不会执行,afterExecute()不会执行;

        afterExecute()

          任务  正常运行、 抛出异常,                     afterExecute()都会执行;

          任务  抛出Error,                        afterExecute()不会执行;

        terminated()

          线程池完成关闭后调用;

    3.2、应用:

        添加日志、时序、监视器、统计信息等;

        

        

以上是关于《java并发编程实践》---第8章 应用线程池的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程从入门到精通 - 第6章:线程池

JAVA并发编程的艺术目录

Java并发编程从入门到精通 - 第5章:多线程之间的交互:线程阀

Java并发编程从入门到精通 - 第3章:Thread安全

Java并发编程与高并发解决方案 视频教程

Java编程思想 第21章 并发