线程池 可以看看这里https://zhuanlan.zhihu.com/p/60986630
线程 --是调度cpu的最小单位
两种线程
1 .ULT 用户级线程
举例,用户常用的app如qq wps等就是自己在管理自己的程序,windows linux对ULT毫无感知,即(线程给app自己管理)
2 KLT 内核线程
即系统或内核自己管理
他们的线程表放的位置也不团
然后可以点击这里看看线程的代码
https://www.cnblogs.com/yangj-Blog/p/12967210.html
====================================================
而线程池是什么
可以理解为线程缓存
在Java中,线程池的概念是Executor这个接口,具体实现为ThreadPoolExecutor类,学习Java中的线程池,就可以直接学习他
对线程池的配置,就是对ThreadPoolExecutor构造函数的参数的配置,既然这些参数这么重要,就来看看构造函数的各个参数吧
ThreadPoolExecutor提供了四个构造函数
//五个参数的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) //六个参数的构造函数-1 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) //六个参数的构造函数-2 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) //七个参数的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
这里面int corePoolSize => 该线程池中核心线程数最大值
int maximumPoolSize该线程池中线程总数最大值
long keepAliveTime该线程池中非核心线程闲置超时时长
TimeUnit unit为keepAliveTime的单位
BlockingQueue<Runnable> workQueue该线程池中的任务队列:维护着等待执行的Runnable对象
ThreadFactory threadFactory创建线程的方式
RejectedExecutionHandler handler抛出异常专用的
然后我们就可以自己手动来创建线程池如下
然后参照对比下面的图片
线程池原理
不过上面的只是理解原理,总结就是
事先准备好一些资源,有人要用就拿我这里拿,用完还给我,下一个人再来拿
比如我事先准备两个,那就是默认大小2,那我最高能支持多少个那就是max,拿不下了就是阻塞,再不行就异常
我们一般用工具类Executors创建线程池
我们在idea中搜索Executors就可以看到里面封装的初始化啊方法等。调用即可。
而它这个工具类有三大方法
1 newSingleThreadExecutor单个线程
2newFixedThreadPool就是固定的线程池大小
3newCachedThreadPool就是可伸缩的,能强能弱
看看第一个举例,单个线程
运行可以发现都被一个线程创建
运行第二个方法,发现最多可以5个线程执行
再看看第三个 ,可伸缩的
发现是遇强则强,遇弱则弱