线程池模式(Thread Pool)

七、线程池模式(Thread Pool)
1、核心思想
使用队列对待处理的任务进行缓存,并复用一定数量的工作者线程去取队列中的任务进行执行。
本质是使用极有限的资源去处理相对无限的任务
2、线程是有限的资源。不仅在执行任务时消耗CPU和内存等资源,线程对象本身以及线程所需的调用栈也占内存,并且java创建一个线程意味着JVM会创建相应的依赖宿主机操作系统的本地线程
3、评价
抵消线程创建的开销,提高响应性。
封装了工作者线程生命周期管理。
减少销毁线程的开销。
4、工作队列选择
a 无界队列(如linkedBlockingQueue),极端情况下可能导致JVM内存溢出,适合在任务占用的内存空间以及其他稀缺资源比较少的情况下使用。
b 有界队列(如ArrayBlockingQueue, 有界的linkedBlockingQueue),防止对象相互引用导致死锁,适合在提交给线程池执行的各个任务之间是相互独立的情况使用。
c 直接交接队列(SynchronousQueue),实现上没有使用缓存队列。
5、线程池大小设置
获取CPU个数代码: Runtime.getRuntime().availableProcessors()
CPU密集型 CPU个数加一
I/O密集型 2 * CPU个数
6、注意线程池泄露,此时要监控线程池,保持线程个数达到最小值。

scheduler = new ThreadPoolExecutor(10, 20, 60*ONE_MINITE_IN_SECONDS, TimeUnit.SECONDS,
                //模式角色 ActiveObject.ActivationQueue
                new ArrayBlockingQueue(200),
                new ThreadFactory() {
                    @Override
                    public Thread newThread(Runnable r) {
                        Thread  t;
                        t = new Thread(r, "AyncRequestPersistence");
                        return t;
                    }
                });
//设置缓存队列饱和策略处理方式为在任务的提交放运行被拒绝的任务
        scheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());


Callable methodRequest = new Callable() {
            @Override
            public Boolean call() throws Exception {
                long start = System.currentTimeMillis();
                try {
                    delegate.store(request);
                } finally{
                    taskTimeConsumerdPerInterval.addAndGet(System.currentTimeMillis() - start);
                }
                return Boolean.TRUE;
            }
        };

        scheduler.submit(methodRequest);

你可能感兴趣的:(java,多线程设计模式)