实现线程池的调用

【前言】
在实际工作中,很少会执行new Thread做多线程处理,而是会创建好线程池,再调用线程池资源。
就像连接数据库,从来不会说,用JDBC建立连接,而是用数据库连接池,Netty通信也是建个Channel通道池。
单独建个JDBC要加载驱动,写URL 数据库配置信息,还得关闭连接,每次都得来一遍很麻烦。new Thread也是一样,每次new Thread都要新建个对象,而且线程也缺乏统一的管理,总不可能每次都给线程命名,如果不小心在循环中new了,还可能出现,不停建新线程直至死机,一些高级的功能,更多执行、定期执行、线程中断也没有。
而线程池就不一样了,前提建好线程,可以重复使用,设置好最大并发数,也不会出现无限制新建线程的情况,定时执行、定期执行、并发数控制这些高级功能也都有。
【正文】
线程池--ThreadPoolExecutor

    public void ThreadPoolExecutor(int corePoolSize, 
               int maximumPoolSize, 
               long keepAliveTime,
               TimeUnit unit, 
               BlockingQueue workQueue,
               ThreadFactory threadFactory, 
               RejectedExecutionHandler handler) {
    }
    corePoolSize    核心线程数量
    maximumPoolSize    最大线程数量    
    keepAliveTime      空闲线程存活时间
    unit    存活时间的单位
    workQueue    阻塞队列,存储等待执行的任务,很重要,对线程池运行影响很大
    threadFactory    线程工厂,创建管理线程
    handler    拒绝处理任务时的策略

    如果存活线程数<核心线程数,直接创建新线程,一般发生在线程池初始化时(维持一定数量备调用);
    如果存活线程数,处于核心和最大之间,阻塞队列没满,先放队列里,只有阻塞队列满,才创建新线程;
    如果存活线程数,超过最大线程数,且阻塞队列满,执行拒绝策略
    好理解的:南京市民大厅,至少开5个窗口(核心线程),市民(任务)超过5个,大厅长椅(阻塞队列)坐得下,就不开新窗口(线程),大厅里坐不下,还有空余窗口(最大线程),就多开窗口,要是窗口全开了,大厅还坐不下,就通知暂停发号(拒绝策略)。

猜你喜欢

转载自www.cnblogs.com/likailun/p/8977612.html