java线程池

线程池 可以看看这里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个线程执行

 再看看第三个 ,可伸缩的

发现是遇强则强,遇弱则弱

原文地址:https://www.cnblogs.com/yangj-Blog/p/13118694.html