zoukankan      html  css  js  c++  java
  • 线程池策略(一)

    ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

      java.util.concurrent.Executors可以产生三种线程池,线程执行的底层代码还是同一个。

      先解释一下ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory)这个类,

    corePoolSize:代表线程池中常存的线程数量。

    maximumPoolSize:指线程池最多可容纳的线程数量。

    keepAliveTime和unit:配合使用,前者是数字,后者是时间单位,意思是当某个线程在规定的时间内没有执行,就会被kill掉,等于0表示不会kill掉。

    workQueue:指等待执行的线程队列,有很多种,可以是数组实现的,也可以是链表实现的,所以它既可以是有界的,也可以是无界的。

    threadFactory:线程池线程产生的工厂类。

    1.newFixedThreadPool(int nThreads),newFixedThreadPool(int nThreads, ThreadFactory threadFactory)

      return 一个new ThreadPoolExecutor(xxx..),n代表的是线程池中固定可重用的数量,而corePoolSize和maximumPoolSize都等于这个n,所以如果一个任务被提交后,会先调用这n个线程中的一个执行,如果线程池满了,则进入workQueue队列等待,如果等待队列也满了,就比较线程池中是否已经达到最大执行线程数量,如果没有达到,放入线程池执行,如果达到了则拒绝接收任务并报reject异常。

    2.newCachedThreadPool(),ExecutorService newCachedThreadPool(ThreadFactory threadFactory),

      return 一个newThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());

    线程池初始线程数为0,可以一直增加到Integer的最大值,某个线程超过60s没有执行内容的话,就会被回收。其等待队列SynchronousQueue中的任务执行策略,默认构造函数为:

    public SynchronousQueue() {
            this(false);
        }

    下面另一个构造函数解释了false的含义:fair if true, waiting threads contend in FIFO order for access; otherwise the order is unspecified.所以显示指定了true才能保证先到先执行,否则未指明哪个先执行。

    所以当有特别的需要的时候,可以按照需要直接构建ThreadPoolExecutor。

  • 相关阅读:
    运算符与优先级
    数据类型
    c++基础
    有关进制
    函数二——递归
    字符串与随机数
    C语言第一课
    Linux-Shell
    Linux入门
    文本处理三剑客命令初探
  • 原文地址:https://www.cnblogs.com/azul0906/p/4214248.html
Copyright © 2011-2022 走看看