设为首页 加入收藏

TOP

Java高并发之线程池详解(二)
2018-06-09 10:07:58 】 浏览:514
Tags:Java 并发 线程 详解

stem.currentTimeMillis()/1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, 0, 2, TimeUnit.SECONDS);
    }
}


潜在宕机风险


使用Executors来创建要注意潜在宕机风险.其返回的线程池对象的弊端如下:


综上所述, 在可能有大量请求的线程池场景中, 更推荐自定义ThreadPoolExecutor来创建线程池, 具体构造函数配置见下文.


线程池大小配置


一般根据任务类型进行区分, 假设CPU为N核


自定义阻塞队列BlockingQueue


主要存放等待执行的线程, ThreadPoolExecutor中支持自定义该队列来实现不同的排队队列.


回调接口


线程池提供了一些回调方法, 具体使用如下所示.


ExecutorService service = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<Runnable>()) {


            @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("线程池退出");
            }
        };


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


自定义拒绝策略


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


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


使用方式也很简单, 直接传参给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), 这样程序退出的时候, 线程自动退出.


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


class NamedThreadFactory implements ThreadFactory {
    private static final AtomicInteger threadIndex = new AtomicInteger(0);
    private final String baseName;
    private final boolean daemon;


    public NamedThreadFactory(String baseName) {
        this(baseName, true);
    }


    public NamedThreadFactory(String baseName, boolean daemon) {
        this.baseName = baseName;
        this.daemon = daemon;
    }


    public Thread newThread(
编程开发网

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python字符串方法大全 下一篇JDK并发包详细总结