• 线程池(1)ThreadPoolExecutor梳理


    使用默认的 thread factory创建ThreadPoolExecutor实例

    public ThreadPoolExecutor(int corePoolSize,
                                  int maximumPoolSize,
                                  long keepAliveTime,
                                  TimeUnit unit,
                                  BlockingQueue<Runnable> workQueue,
                                  RejectedExecutionHandler handler)

    例子:

    //创建阻塞队列
            BlockingQueue<Runnable> blockQueue = new ArrayBlockingQueue<Runnable>(20);
            ThreadPoolExecutor pool = new ThreadPoolExecutor(3,5,50,TimeUnit.MILLISECONDS,blockQueue);
            pool.allowCoreThreadTimeOut(false);//默认false
            Runnable task = new Runnable() {
                @Override
                public void run() {
                    log.info("{}正在运行", Thread.currentThread().getName());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            pool.execute(task);
            
            pool.shutdown();

    参数解释:

    corePoolSize:线程池中的核心线程数

    maximumPoolSize:线程池中的最大线程数

    keepAliveTime:

    • 当allowCoreThreadTimeout=false(默认)时,超过corePool的线程空闲的时间达到了keepAliveTime时间时,这些线程会超时关闭,直到线程数=corePoolSize。因此,
    • corePool的线程数,是固定的且永久有效的。即,即使当前没有需要执行的任务,也依然存活
    • 当allowCoreThreadTimeout=true时,包含corePool线程的所有线程的空闲时间达到了keepAliveTime时间时,这些线程会超时关闭,直到线程数=0。因此,
    • 线程池中的线程数<指定的corePool线程数时,当有新任务来时,即使有空闲线程,也会优先创先新线程来处理该任务,直到线程数=指定的corePool线程数。

    workQueue:

    • 保存由execute方法提交的Runnable任务。
    • 阻塞队列分类:
      • ArrayBlockingQueue:FIFO。
      • LinkedBlockingQueue:FIFO。Executors.newFixedThreadPool使用该阻塞队列
      • SynchronousQueue:不存储任务。Executors.newCachedThreadPool使用该阻塞队列。

    执行顺序

    当线程数<指定corePool线程数时,创建线程。

    当线程数>=指定corePool线程数,且任务队列未满时,将任务放入workQueue。

    当线程数>=指定corePool线程数,且任务队列已满时,

    • 若线程数 < maximumPoolSize,则,创建线程
    • 若线程数 = maximumPoolSize,则,执行下边的handler,默认AbortPolicy即抛出异常。

    还有1种情况会执行下边的handler,即:当执行shutdown();后,新进来的任务,就会被拒绝,此时调用handler。

    handler:(ThreadPoolExecutor类中的几个内部实)

    • AbortPolicy(默认):丢弃任务,抛出RejectedExecutionException异常
    • DiscardPolicy:也是丢弃任务,但不抛出异常
    • DiscardOldestPolicy:对被拒绝的任务(新来的)不抛弃,而是抛弃队列里面等待最久的一个任务,然后把该拒绝任务加到队列
    • CallerRunsPolicy:重试添加当前被拒绝的任务,他会自动重复调用 execute() 方法,直到成功。

    ---------------------------最后,说下关闭

    shutdown():平滑地关闭

    • 不会立即终止线程池
    • 停止接收新任务,并等待执行已提交的任务。已提交的任务=一类是已经在执行的+另一类队列中还没执行的。
    • 如果是服务器的,则不调用shutdown方法,即一直执行。

    shutdownNow():立即关闭

    • 立即终止线程池
    • 停止接收新任务,已提交的任务直接打断,并清空缓存队列
    • 返回尚未执行的任务列表(Runnable List)
  • 相关阅读:
    Windows 2008 R2 远程桌面服务(八)远程桌面服务器安全设置
    从硬盘上安装SQLServer2005的问题
    在 Windows server 2008 下计划任务无法正常执行bat批处理文件
    两部搞定windows server 2008 R2 中IE8的增强安全配置功能
    Microsoft SQL Server 2005 Service Pack 4 RTM
    学习地址
    Windows 2008 远程桌面如何设置两个用户共享一个会话
    Windows Server 2008 启用无线网卡
    远程桌面连接指定会话(Session)
    固定宽度弹性布局(以适应各种各辨率)
  • 原文地址:https://www.cnblogs.com/yaoyuan2/p/9606267.html
Copyright © 2020-2023  润新知