多线程(八):线程池

包括:
一. 线程池概念
二. 线程池几个重要的类    
三. 线程池使用Demo(待实现)

一. 线程池概念
         并发数量太多的时候,就需要频繁的创建线程和销毁线程,那么创建和销毁这个过程是比较耗费时间的。所以说,可以使用线程池的方法避免这个问题。
         线程池相关的东西主要在 java.util.concurrent 包中。

二. 线程池几个重要的类         
  1. ExecutorService:真正的线程池接口。
  2. ThreadPoolExecutor:ExecutorService 的默认实现。
  3. ScheduledExecutorService:能和 Timer/TimerTask类似,解决那些需要任务重复执行的问题。
  4. ScheduledThreadPoolExecutor:继承了 ThreadPoolExecutor 和实现了 ScheduledExecutorService 接口,能实现周期性的任务调度。
整个类结构如下图:

其中,核心类 ThreadPoolExecutor 分析如下:
1. 构造方法:
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         Executors.defaultThreadFactory(), defaultHandler);
}

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         threadFactory, defaultHandler);
}

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          RejectedExecutionHandler handler) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         Executors.defaultThreadFactory(), handler);
}

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) {
    if (corePoolSize < 0 ||
        maximumPoolSize <= 0 ||
        maximumPoolSize < corePoolSize ||
        keepAliveTime < 0)
        throw new IllegalArgumentException();
    if (workQueue == null || threadFactory == null || handler == null)
        throw new NullPointerException();
    this.corePoolSize = corePoolSize;
    this.maximumPoolSize = maximumPoolSize;
    this.workQueue = workQueue;
    this.keepAliveTime = unit.toNanos(keepAliveTime);
    this.threadFactory = threadFactory;
    this.handler = handler;
}

参数含义:
  • corePoolSize:创建线程池之后,默认没有任何线程,而是有任务来才创建线程。当线程池中的线程数目达到corePoolSize的时候,就会把到达的任务放入缓存队列中。
  • maximunPoolSize:线程池最大的线程数,它表示线程池中最多可以创建多少个线程。
  • keepAliveTime:线程没有任务执行的时候最多会保持多长的时间会中止,默认情况下,只有当线程数大于corePoolSize 的时候,如果一个线程空闲的时候达到 keepAliveTime,则会中止,直到线程池中的线程数大于corePoolSize。
  • unit:参数 keepAliveTime 的单位,有7种取值。天,小时,分钟,秒,毫秒,微妙,纳秒。
  • workQueue:一个阻塞队列,用来存储等待执行的任务,一般会有如下几种选择:
    • ArrayBlockingQueue。
    • LinkedBlockingQueue。
    • SynchronusQueue。
  • threadFactory:线程工厂,主要用来创建线程用的。
  • hanlder:表示当拒绝任务时使用的策略,一般有如下几种取值:
    • ThreadPoolExecutor.AbortPolicy:丢弃任务并且抛出RejectExecutionException异常。
    • ThreadPoolExecutor.DiscardPolicy:丢弃任务但是不抛出异常。
    • ThreadPoolExecutor.DiscardOldestPolicy:丢弃最前面的任务,然后重新执行任务。
    • ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。

2. 核心方法
executor()
submit()
shutdown()
shutdownNow()

  • executor():向线程池提交一个任务,并且交由线程池去执行。
  • submit()方法:也是向线程池提交一个任务,但是和submit()方法不一样的是,可以返回结果。
  • shutdown(),shutdownNow() :用来关闭线程池。

注意:在 java doc 中,并不提倡我们直接使用ThreadPoolExecutor。而是使用Executors 类中提供的几个静态方法:
  • Executors.newCachedThreadPool():创建一个缓冲池,池的容量大小为 Integer.MAX_VALUE。 
  • Executors.newSingleThreadPool():创建容量为1 的缓冲池。
  • Executors.newFixedThreadPool(int):创建一个固定大小的缓冲池。

三. 线程池使用Demo(待实现)

参考:
  1. Java并发编程:线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值