🙉专栏推荐:Java入门知识🙉
🙉 内容推荐:<计算坤是如何工作的>🙉
🐹今日诗词:百年兴衰皆由人, 不由天🐹
⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏
⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏
线程池
由来
由来: 进程的频繁创建销毁,会导致资源开销非常大,因此引入线程的来缓解这个问题,但是频率进一步提升,线程的开销也不能忽略了,这时候可以通过线程池来缓解这个问题.
线程池把经常使用的线程提前创建好,用完了也不要销毁释放,留着下次使用,这样节省了创建和销毁的开销,和函数非常相似,都是复用,不用重新分配资源创建任务,需要的时候从线程池中取出使用,不使用时就放回线程池,省去了创建和销毁开销
概念
概念: 提前把经常使用的线程在线程池中准备好,使用时从池中取出,用完再放回池中,这样就不用频繁从内核中申请空间创建线程了
线程池相关的类
类名: ThreadPollExecutor
构造方法有四种
我们只需要看最复杂的就可以了,最复杂的包括所以构造方法的参数
构造方法参数
构造方法参数: (int corePoolSize)核心线程数和(int maximumPoolSize)最大线程数
构造方法参数: (long keepAliveTime)保持存活时间和(TimeUnit unit)时间单位
构造方法参数:(BlockingQueue<Runnable> woreQueue)设置任务队列
构造方法参数:(ThreadFactor threadFactory)线程工厂
理解线程工厂之前我们来看看什么是工厂模式
工厂模式: 通过静态方法封装new操作,在静态方法中完成对象属性初始化的过程就是工厂模式
工厂模式的由来
构造方法参数:(ThreadFactor threadFactory)线程工厂
线程池最重要的参数
构造方法参数:(RejectedExecutionHandler) 任务拒绝策略
Executors工厂类
由于ThreadPoolExecutor构造方法参数特别多,用起来很麻烦,所以Executor工厂类对它进行了封装,提供了这几种参数
返回类型是ExecutorSevice
用法演示:
如何设置合适的线程数目
上面的方法中是随机给的线程数目, 那么该怎么选择一个合适的数目呢?
分成两种,看代码是CPU密集型还是IO密集型
CPU密集型
这个线程基本都在CPU上运行,比如1+....+100的操作
IO密集型
这个线程基本都在等待IO, 比如Scanner
正确的线程数目
极端情况下
CPU密集型: 不超过CPU最大核心线程数(N)
IO密集型: 可以远远超过CPU最大核心线程数
模拟实现线程池
这里我们模拟固定线程数目的线程池
步骤:
1. 提供构造方法传入线程数目
2. 根据传入的数目创建线程
3. 将任务放到阻塞队列中
4. 每个线程从阻塞队列中取出并执行
具体代码实现
前三步
我们来写个案例来测试一下吧
这个问题很好解决
运行结果
美图分享
✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄
⭐️点赞收藏加关注,学习知识不迷路⭐️
🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉
👍😏⛳️点赞☀️收藏⭐️关注😏👍
👍😏⛳️点赞☀️收藏⭐️关注😏👍
👍😏⛳️点赞☀️收藏⭐️关注😏👍
🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️