当前位置: 首页 > 图灵资讯 > 技术篇> java线程池解析

java线程池解析

来源:图灵教育
时间:2023-04-02 17:43:10

  学过java的人必须知道多线程,多线程该技术主要解决了处理器单元中多线程执行的问题,可以显著减少处理器单元的闲置时间,提高处理器单元的吞吐量。过度的线程也可能导致资源耗尽的风险,此时线程池已成为java中的神来之笔。现在我们来java线程池分析,看看它的独特之处。

  线程池的引入便于管理线程任务,降低了资源损失的风险。在jdk1.5开始的java中,涉及线程池的相关类别是jdk1.5.util.concurrent包中涉及的几个核心类别和接口包括:Executor、Executors、ExecutorService、ThreadPoolExecutor、FutureTask、Callable、Runnable等。

  线程池可以自动创建或手动创建,自动创建体现在在Executors工具类中,可以创建newfixedthreadPol、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool;每个参数都可以灵活设置线程池,手动创建在代码中,即ThreadPolexecutor类结构器中,各种实参的差异体现在代码中:

  public static ExecutorService newFixedThreadPool(int var0) {

  return new ThreadPoolExecutor(var0, var0, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());

  }

  public static ExecutorService newSingleThreadExecutor() {

  return new Executors.FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()));

  }

  public static ExecutorService newCachedThreadPool() {

  return new ThreadPoolExecutor(0, 2147483647, 60L, TimeUnit.SECONDS, new SynchronousQueue());

  }

  public static ScheduledExecutorService newScheduledThreadPool(int var0) {

  return new ScheduledThreadPoolExecutor(var0);

  }

  public ThreadPoolExecutor(int corePoolSize,

  int maximumPoolSize,

  long keepAliveTime,

  TimeUnit unit,

  BlockingQueue workQueue,

  ThreadFactory threadFactory,

  RejectedExecutionHandler handler) {……}

  下面给大家介绍一下ThreadPolexecutor中的几个重要参数:

  corePoolSize:核心线程数也是线程池中常驻的线程数。当线程池初始化时,默认没有线程。当任务到来时,创建线程执行任务

  maximumPoolSize:最大线程数可能会在核心线程数的基础上增加一些非核心线程。需要注意的是,只有当workQueue队列填满时,才会创建比corepolsize更多的线程(线程池总线程数不超过maxpolsize)

  keepAliveTime:超过keepalivetime的非核心线程空闲时间将自动终止回收。请注意,当corepolsize=maxpolsize时,kepalivetime参数不起作用(因为没有非核心线程);

  unit:keepalivetime时间单位

  workQueue:用于保存任务的队列可以是三种无界、有界、同步移交的队列类型之一。当池中的工作线程大于corePolsize时,新任务将被放入队列中

  threadFactory:创建线程的工厂类默认使用Executors.defaultThreadFactory()也可以用guava库的ThreadFactoryBuilder来创建

  handler:当线程池不能继续接收任务时(队列已满,线程数达到maximunPolsize)的饱和策略,值为AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy、DiscardPolicy

  线程在线程池中创建流程图:

  workQueue队列:

  SynchronousQueue(同步移交队列):队列不作为任务的缓冲模式,可以简单理解为队列长度为零

  LinkedBlockingQueue(无界队列):队列长度不受限制。当要求越来越多(任务处理速度跟不上任务处理速度,导致要求积累)时,可能会导致内存占用过多或OOM