JUC锁的理解(下)

> 池化技术

线程池、连接池、内存池、对象池 ............

为什么要用线程池:==线程复用==

> 关于我们的线程池

三大方法、七大参数、4种拒绝策略

三大方法:newSingleThreadExecutor();
         newCachedThreadPool();
         newFixedThreadPool()
其中三大方法的底层均调用了 new ThreadPoolExecutor
七大参数:
        (1,   //核心线程数
        3, //最大线程数
        3L,  //存活时间(最大线程数-核心线程数)被唤醒工作空间时间段
        TimeUnit.SECONDS,  //时间单位
        new ArrayBlockingQueue(3),//阻塞队列
        Executors.defaultThreadFactory(),//线程工厂(默认不变)
        new ThreadPoolExecutor.CallerRunsPolicy());
四大拒绝策略:CallerRunsPolicy   哪来的去哪里找对应的线程执行
            AbortPolicy         直接拒绝
            DiscardOldestPolicy 尝试获取任务,不一定执行
            DiscardPolicy       不抛出异常,丢弃任务

四大策略的底层原理是由于阻塞队列的存放机制决定的

| 方法  | 第一组会抛出异常 | 返回一个布尔值,不会抛出异常 | 延时等待       | 一直等待|
| 插入  | add()          | offer(e)                   | offer(e,time) | put()  |
| 取出  | remove()       | poll()                    | poll(time)    | take() |
| 检查  | element()      | peek()                   | -               | -      |
代码如下:
public static void main(String[] args) {
    //只能有一个线程!
    //ExecutorService threadPool1 = Executors.newSingleThreadExecutor();
    //遇强则强!可伸缩!
    //ExecutorService threadPool2 = Executors.newCachedThreadPool();
    //固定线程的线程池
    //ExecutorService threadPool3 = Executors.newFixedThreadPool(5);
    ExecutorService threadPool4 = new ThreadPoolExecutor
                          (1,   //核心线程数
                          3, //最大线程数
                          3L,  //存活时间(最大线程数-核心线程数)被唤醒工作空间时间段
                          TimeUnit.SECONDS,  //时间单位
                          new ArrayBlockingQueue(3),//阻塞队列
                          Executors.defaultThreadFactory(),//线程工厂(默认不变)
                          new ThreadPoolExecutor.CallerRunsPolicy());//拒绝策略
    System.out.println(Runtime.getRuntime().availableProcessors());//可用的CPU核数
    try {
        for(int i=1;i<=11;i++){
            threadPool4.execute(()->{
                System.out.println(Thread.currentThread().getName() + " ok");
            });
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // 使用完毕后需要关闭!
        threadPool4.shutdown();
    }
}
上一篇:每日Scrum(1)


下一篇:吃透Java并发十六:线程池之ThreadPoolExecutor