对线程知识的相关思考
ThreadPoolExecutor 用来创建自定义的线程池;
corePoolSize, 核心线程数
maximumPoolSize,最大线程数,不能超过核心线程数
keepAliveTime, 存活时间 普通线程能够存活的时间
unit, 单位
workQueue,队列四种
Executors.defaultThreadFactory(), 线程工厂 暂时没研究
handler 丢弃策略
1.整个流程是这样的,任务到来;
2.用核心线程进行处理 如果有十个核心线程,就处理十个任务;
3.核心线程被用完了,再到来的任务需要加入到队列之中;
4.队列中满了,开始创建非核心线程进行处理,最大能创建的非核心线程数是max-core
5.处理剩余的任务,关闭线程池;
创建一个自定义的线程池
private static ExecutorServicees =
new ThreadPoolExecutor(0,100,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(1000),new ThreadPoolExecutor.CallerRunsPolicy());
如果 此时来了1500个任务,这个时候 会先将一千个任务放到队列中,
剩下的再来,队列满了开始创建非核心线程 100个
然后从队列中拉去100个任务开始处理 这样就还有400个任务在没有进队列,
此时因为用了CallerRunsPolicy()策略 这几百个任务交给主线程去处理;
马上线程池中一百个任务处理完了 然后400个里面会有100个线程进队列;
300个交给主线程去处理;
直到全部处理完成;
如果是1100个 那么自始至终不会动用 主线程;
如果小于 那么队列不满,就只创建一个非核心线程慢慢跑
四种处理策略
1.CallerRunsPolicy 字面翻译 呼叫运行的线程,谁调用我 我找谁帮忙;
2.discardPolicy 直接丢弃 如果上面 1500用了这个策略就没有前边400个事情了;
3.discardOldestPolicy 丢弃在队列中存在时间最长的
4.AbortPolicy 默认值;抛出RejectedExecutionException异常;
LinkedBlockingQueue 无限长 的队列 但是可以设置长度;
ArrayBlockingQueue 必须设置长度 而且任务不能超过;
还有一个要记住
ExecuteService es = new ThreadPoolExecutor(...)
可以看出来 继承关系
ThreadPoolExecutor 继承了 AbstractExecutorService ;
AbstractExecutorService 实现了 ExecutorService;
ExecutorService 实现了 Executor ;
Executor 定义了submit 方法;
Executors是一个类和他们都没有关系 它里面搞了很多静态方法
Executors.newSingleThreadExecutor();
Executors.newFixedThreadPool(1);
Executors.newCachedThreadPool();
Executors.newScheduledThreadPool(1);
没啥用还是得自己建,阿里公约什么的说的