美文网首页
线程池使用

线程池使用

作者: yanshihao | 来源:发表于2021-12-03 13:55 被阅读0次

    ThreadPoolExecutor 线程池

    创建线程池,主要利用 ThreadPoolExecutor 这个类,

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

    corePoolSize: 该线程池中核心线程的数量。

    注意:线程池中存在核心线程与非核心线程,核心线程一旦创建会一直执行任务或等待任务到来,而非核心线程只在任务队列塞满任务时去执行多出的任务,并且非核心线程在等待一段时间后将会被回收,这个时间作为参数可调配,

    maximumPoolSize:该线程池中最大线程数量。(区别于corePoolSize)

    keepAliveTime:从字面上就可以理解,是非核心线程空闲时要等待下一个任务到来的时间,当任务很多,每个任务执行时间很短的情况下调大该值有助于提高线程利用率。
    注意:当allowCoreThreadTimeOut属性设为true时,该属性也可用于核心线程。

    unit:上面时间属性的单位

    workQueue:任务队列,后面详述。

    threadFactory:线程工厂,可用于设置线程名字等等,一般无须设置该参数。

    handler: 饱和策略

    线程执行流程

    1.execute一个线程之后,如果线程池中的线程数未达到核心线程数,则会立马启用一个核心线程去执行。

    2.execute一个线程之后,如果线程池中的线程数已经达到核心线程数,且workQueue未满,则将新任务放入workQueue中等待执行。

    3.execute一个线程之后,如果线程池中的线程数已经达到核心线程数但未超过非核心线程数,且workQueue已满,则开启一个非核心线程来执行任务。

    4.execute一个线程之后,如果线程池中的线程数已经超过非核心线程数,则拒绝执行该任务,采取饱和策略,并抛出RejectedExecutionException异常。

    注意 使用 threadFactory工厂的时候,

    public interface ThreadFactory {
    
        Thread newThread(Runnable r);
    }
    

    创建Thread的时候,需要把runnbale对象传递给创建的thread类,
    如果不传递的话,线程执行的时候,会运行thread的run方法

      val threadFactory = ThreadFactory {
                val thread = Thread(it)
                thread.name = "executor-${seq.getAndIncrement()}"
                thread
            }
    

    相关文章

      网友评论

          本文标题:线程池使用

          本文链接:https://www.haomeiwen.com/subject/yegpxrtx.html