> 池化技术
线程池、连接池、内存池、对象池 ............
为什么要用线程池:==线程复用==
> 关于我们的线程池
三大方法、七大参数、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(); } }