Java高并发之线程池详解(2)

@Override
            protected void beforeExecute(Thread t, Runnable r) {
                System.out.println("准备执行任务: " + r.toString());
            }

@Override
            protected void afterExecute(Runnable r, Throwable t) {
                System.out.println("结束任务: " + r.toString());
            }

@Override
            protected void terminated() {
                System.out.println("线程池退出");
            }
        };

可以在回调接口中, 对线程池的状态进行监控, 例如任务执行的最长时间, 平均时间, 最短时间等等, 还有一些其他的属性如下:

taskCount:线程池需要执行的任务数量.

completedTaskCount:线程池在运行过程中已完成的任务数量.小于或等于taskCount.

largestPoolSize:线程池曾经创建过的最大线程数量.通过这个数据可以知道线程池是否满过.如等于线程池的最大大小,则表示线程池曾经满了.

getPoolSize:线程池的线程数量.如果线程池不销毁的话,池里的线程不会自动销毁,所以这个大小只增不减.

getActiveCount:获取活动的线程数.

自定义拒绝策略

线程池满负荷运转后, 因为时间空间的问题, 可能需要拒绝掉部分任务的执行.

jdk提供了RejectedExecutionHandler接口, 并内置了几种线程拒绝策略

AbortPolicy: 直接拒绝策略, 抛出异常.

CallerRunsPolicy: 调用者自己执行任务策略.

DiscardOldestPolicy: 舍弃最老的未执行任务策略.

使用方式也很简单, 直接传参给ThreadPool

ExecutorService service = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS,
                new SynchronousQueue<Runnable>(),
                Executors.defaultThreadFactory(),
                new RejectedExecutionHandler() {
                    @Override
                    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                        System.out.println("reject task: " + r.toString());
                    }
                });

自定义ThreadFactory

线程工厂用于创建池里的线程. 例如在工厂中都给线程setDaemon(true), 这样程序退出的时候, 线程自动退出.

或者统一指定线程优先级, 设置名称等等.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c672bb3ceae89238c5b266979a88a7f8.html