java线程池

线程的五大状态:创建、就绪、运行、阻塞、死亡

一、线程池详解

    1.作用:线程的复用,减少新建线程和销毁线程的开销;
                  控制线程最大并发数量(防止同时创建n多线程浪费系统资源);
                  实现特定功能(延时执行/定时循环执行等)。
    2.重要参数:corePoolSize:核心池大小
            maximumPoolSize:线程池最大线程数
            keepAliveTime:线程存活时间(线程数大于核心池大小的数量时,超过线程的存活时间就销毁)      
            workQueue:任务队列(用于传输和保存等待执行任务的阻塞队列)
            threadFactory:线程工厂,用于创建新线程。threadFactory创建的线程也是采用new Thread()方式,线程名风格统一。
            handler:拒绝策略。
    3.处理任务的优先级: 核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize
    4.如果达到maximumPoolSize且缓存队列满了,使用拒绝策略处理被拒绝的任务: a.丢弃+抛异常(AbortPolicy)    b.还给调用线程自己处理(CallerRunsPolicy)    c.直接丢弃当前的(DiscardPolicy)    d.丢弃队列最前面的(DiscardOldestPolicy) 
    5.线程回收:当前线程数量超过核心池大小,且线程空闲时间超过keepAliveTime时,回收此线程。
    6.位于java.util.concurrent包下
    7. 使用ThreadPoolExecutor创建线程池: 核心池大小5;最大线程数512;keepAliveTime0;阻塞队列:new LinkedBlockingQueue<>(1024); 拒绝策略:new ThreadPoolExecutor.AbortPolicy(); 

实际使用场景: 异步存ES供搜索会话/异步数据上报/异步通知O关闭工单/异步closeSession等不影响主流程但是耗时的操作(使程序更快响应)。

二、Callable、Future和FutureTask

    1.execute没有返回值,如果不需要知道线程的结果就使用execute方法,性能好。
    2.submit返回一个Future对象,如果想知道线程结果就使用submit提交,而且它能在主线程中通过Future的get方法捕获线程中的异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值