线程池
1.重复使用线程执行任务,减少线程创建和销毁的消耗
2.减少创建和销毁 提高了系统的效率
3.综合管理线程
线程池执行过程
包含: 1.核心线程池 未满-创建线程执行任务 满了交给阻塞队列
2.阻塞队列 未满 放入阻塞队列 满了 交给线程池
3.线程池 未满创建线程,满了交给线程池
4.饱和策略
创建线程池
第一类:ThreadPoolExecutor 他的三个子类
第一个不限制线程个数
ExecutorService executorService = Executors.newCachedThreadPool();
newFixedThreadPool()与newCachedThreadPool()相比可以设置线程的个数。
ExecutorService executorService = Executors.newFixedThreadPool(3);
只有一个线程运行
ExecutorService executorService = Executors.newSingleThreadExecutor();
启动多线程
executorService.execute(new RuanAble接口实现类);
关闭线程池
executorService.shutDown();
第二类:ScheduledExecutorService
只有一个线程运行
newSingleThreadScheduledExecutor
多个线程运行
newThreadScheduledExecutor
第三类ForkJoinPool
核心是分而治之,一块蛋糕分成多份,然后去吃掉他
线程池的生命周期
运行状态 和 终止状态
运行状态进入终止状态会经过
1.shutdown 不接受新的任务 但是会执行完阻塞队列中的任务
2.stop 不接受新的任务,并终止处理中的任务
完成上面两种后都会进入 tidying状态
有效线程数为0调用terminated()方法 进入终止状态
线程池的创建 第一类的线程池,都会调用一下的方法
public ThreadPoolExecutor(
int corePoolSize, 核心线程池个数
int maximumPoolSize, 线程池创建线程的最大个数
long keepAliveTime, 空闲线程的可存活的时间
TimeUnit unit, 时间单位TimeUnit.SECORD 以秒为单位
BlockingQueue<Runnable> workQueue, 阻塞队列
ThreadFactory threadFactory, 创建线程的工程类
RejectedExecutionHandler handler 饱和策略
) {
}
阻塞队列
1.ArrayBlockingQueue
基于数组的阻塞队列的实现,在生产者和消费者中共用一个锁对象,无法并行运行
2.LinkedBlockingQueue
基于链表实现,生产者与消费者分别采用独立的锁对象,可以并行运行
3.DelayQueue
只会阻塞消费者 延迟队列
4.PriorityBlockingQueue
只会阻塞消费者 直接输出对象可以得到 队列中的数据 队列中每次add都会加在队列最前面,每次take()方法都会减少一个数据 这个数据是后放先出
5.SynchronousQueue
没有缓冲区 针对生产者与消费者的时候 那么就相当于 生产一个必须消费一个之后才能继续生产
饱和策略/拒绝策略
当任务超出线程的个数 ,即有100个任务,你只有30个线程,当第31个进来的时候会有下面的情况
1.AbortPolicy
丢弃新的任务,并抛出异常RejectExecutionException
2.DiscardPolicy
丢弃新的任务,但是不抛出异常
3.DiscardOldestPolicy
丢弃最前面的任务,重新执行任务
4.CallerRunsPolicy
调用线程处理
execute()方法
和
submite()方法
execute()需要的是Runable接口实现类
submit()可以是Runable接口实现类和Callable接口实现类
execute()没有返回值
submit()有返回值
线程池
原文:https://www.cnblogs.com/wxgShareBlog/p/14594694.html