多线程案例(线程池)

🙉专栏推荐: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. 每个线程从阻塞队列中取出并执行

具体代码实现

前三步

我们来写个案例来测试一下吧

这个问题很好解决

运行结果

美图分享

✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄

⭐️点赞收藏加关注,学习知识不迷路⭐️

🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

White graces

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值