多线程(线程池原理)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程(线程池原理)相关的知识,希望对你有一定的参考价值。

背景

阿里电面-线程池是如何实现的?这个问题的侧重点是什么?

普通的数据库连接池的概念一般是这样的,多个被静态代理或者动态代理生成的数据库连接,直接放到一个池子里,比方说一个队列,这个数据库连接池提供了如下的方法:

技术图片

这是典型的池化的思想。

Java的线程池则不是这个池化的思想

Java的线程池是生产者-消费者模式。

ThreadPoolExecutor的构造函数很复杂,它的7个参数分别如下:

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

corePoolSize,表示线程池保有的最小线程数;

maximumPoolSize,表示线程池的最大线程数。

keepAliveTime&unit,如果一个线程空闲了keepAliveTime&unit的时间之后,而且线程数大于corePoolSize,那么这个线程就要被回了。

workQueue,工作队列,注意这个队列不是用来存放线程的,而是用来存放任务的,这个和其他池化的思想是不一样的。

threadFactory,这个参数自定义创建线程,比方说指定线程的名字。

handler 如果线程都再忙碌或者任务队列已满,自定义任务的拒绝策略,一共4种,当然1.6以后也支持通过方法allowsCoreThreadTimeOut 实现所有线程都能超时退出。

1、CallerRunsPolicy,提交任务的线程自己去执行任务。
2、AbortPolicy 默认的拒绝策略,抛出异常。
3、DiscardPolicy,直接丢弃任务,不抛出异常。
4、DiscardOldestPolicy,丢弃最老的任务,新任务增加到工作对列

那么线程池放到哪里了呢?

线程都放在了一个HashSet里面了

技术图片

以上是关于多线程(线程池原理)的主要内容,如果未能解决你的问题,请参考以下文章

java多线程系类:JUC线程池:03之线程池原理(转)

Java多线程系列--“JUC线程池”04之 线程池原理

Java多线程系列--“JUC线程池”02之 线程池原理

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

Java多线程系列--“JUC线程池”02之 线程池原理

多线程——Java线程池原理深入