目录
一、引言
线程池是多线程学习中一个十分重要的点,本篇博客,作者会给大家介绍以下线程池的意义,线程池的参数介绍,线程池的工作流程,使用Executors创建常见的线程池。
二、线程池的意义
1.降低资源消耗:减少线程的创建和销毁的性能开销。
我们可以将已经创建的线程放入线程池中,这样在之后我们需要利用该线程时,可以不用再次创建,这样减少了线程的创建和销毁的性能开销。
2.提高响应速度:当任务来时可以直接使用,不用等待线程创建。
3.可管理性:进行统一的分配,监控,避免大量的线程间因互相抢占系统资源导致的阻塞现象。
利用线程池,可以进行任务的分配即现在哪个线程工作,这样避免了线程的抢占,而出现阻塞的现象。
三、线程池的参数介绍
上述图片中,辞退的意思就是是否会被销毁,corePoolSize就不会被销毁。
四、Executors创建线程池的几种方式
1.newFixedThreadPool:创建固定线程数的线程池
2.newCachedThreadPool:创建线程数目动态增长的线程池
3.newSingleThreadExecutor:创建只包含单个线程的线程池
4.newScheduledThreadPool:设定延迟时间后执行命令,或者定期执行命令,是进阶版的Timer。
Executors本质上是ThreadPoolExecutor类的封装。
五、线程池的实现
核心操作是submit,将任务加入到线程池中
使用Worker类来描述一个工作线程,使用Runnbale描述一个任务
使用一个BlockingQueue组织所有的任务
每个Worker线程要做的事:不停地从BlockingQueue中取任务并执行
指定以下线程池中最大线程数maxCountWorker,当线程数超过这个最大值的时候,就不再新增线程了。
public class Demo34 {
public static void main(String[] args) {
// 创建一个最普通的线程池.
// 能够根据任务的数目, 自动进行线程扩容.
// ExecutorService service = Executors.newCachedThreadPool();
ExecutorService service= Executors.newFixedThreadPool(10);
for(int i=0;i<10000;i++){
int id=1;
service.submit(new Runnable() {
@Override
public void run() {
System.out.println("hello "+id+","+Thread.currentThread().getName());
}
});
}
}
}
六、总结
本篇文章简单地介绍了一下线程池的意义,线程池的创建方式以及实现代码,大家如果对线程池感兴趣还可以自己在IDEA中看线程池的原码。欢迎在评论区讨论,最后,感谢大家观看!