线程池的7大参数以及线程池处理逻辑

1.首先我们来看一下为什么使用线程池,使用线程池能给我们的系统带来什么样子的好处?

①:降低资源消耗:减少了创建线程和销毁线程的次数,每个工作线程都可以重复被利用,可执行多个任务

②:提高响应速度:当任务到达时,可以不用等待线程的创建就能立即执行。 

③:提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性。使用线程池可以统一的进行分配、调优和监控。

2.如何创建线程池?

根据阿里编码规范手册,我们不能使用Executors工具类来帮我们创建线程池,而是需要我们根据线程核心类【ThreadPoolExecutor】来手写线程池。那么就涉及到线程池的7大参数,下面我们来看一下线程池的7个核心参数。

3.线程池的7大核心参数

corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAliveTime:多余的空闲线程的存活时间
unit:keepAliveTime的单位
workQueue:任务队列,被提交但尚未执行的任务
threadFactory:线程池中工作线程的创建工厂。用于创建线程一般使用默认的即可。
handler:拒绝策略。表示当任务队列已满并且工作线程的数量大于线程池中的最大线程数【maximumPoolSize】的时候,启用的饱和拒绝策略。

4.线程池的工作原理?

通过上面的讲解,我们已经了解了创建线程池的核心参数的意义。那么下面我们来看一下线程池的工作原理,深入了解各个参数的具体含义。

线程池工作流程如下:

1.首先用户提交任务到线程池,判断当前工作的线程数量有没有大于核心线程数【corePoolSize】

→如果小于核心线程数,则创建线程并执行任务。

→如果大于核心线程数,则判断队列是否已满

    →如果任务队列没有满,则把任务缓存到任务队列中【workQueue】

    →如果任务队列已满,则判断当前工作线程数量是否大于最大线程数量【maximumPoolSize】

        →如果没有大于最大线程数量,则创建线程并执行任务

        →如果大于最大线程数量,则启用线程池的拒绝策略【handler】

为了让大家更加直观的感受,我特意画了一张工作流程图

5.线程池的拒绝策略

AbortPolicy:【默认】直接抛出RejectedExecutionException异常,阻止系统正常运行

DiscardPolicy:直接丢弃任务,不与任何处理,也不抛出异常。如果允许任务丢失,这是一种好的方案。

DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务添加都队列中,尝试再次提交当前任务

CallerRunsPolicy:"呼叫着运行"一种调试机制。该策略既不会抛弃任务,也不会抛出异常。而是将某些任务回退给调用者,从而降低新任务的流量。

6.小tip

身为IT工作者,我们要有属于自己独特的方式去查看电脑的线程数。使用以下代码即可查看电脑的线程数!

System.out.println("当前电脑线程数量是:"+Runtime.getRuntime().availableProcessors());

 

 

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: RestTemplate是Spring提供的用于访问HTTP服务的客户端工具,它封装了发送HTTP请求、处理响应等操作。但在处理多个请求时,使用RestTemplate可能会面临性能瓶颈和资源耗尽的问题。这时可以结合线程池来批量处理返回结果,提升性能。 线程池是一种用于管理多个线程的机制,它通过维护一定数量的线程,并对任务进行分配和执行,解决了频繁创建和销毁线程的开销问题。RestTemplate结合线程池的思路是将多个请求分配给线程池中的线程去处理,然后等待所有请求返回结果后再进行下一步处理。 具体实现可以按照以下步骤进行: 1. 创建一个线程池,指定线程池的大小,可以根据实际情况设置。 2. 将需要处理的每个请求封装成一个Callable对象,实现call()方法,在其中使用RestTemplate发送请求并处理响应。将这些Callable对象添加到一个Callable集合中。 3. 调用线程池的invokeAll()方法,传入Callable集合,等待所有请求返回结果。该方法会返回一个Future集合,可以通过它来获取每个请求的返回结果。 4. 遍历Future集合,分别获取每个请求的返回结果,并进行后续处理。 通过使用线程池和批量处理返回结果,可以有效地提升处理多个请求的性能。使用线程池可以复用线程资源,减少线程创建和销毁的开销;而批量处理返回结果可以减少等待时间,提高整体处理效率。同时,结合线程池和批量处理也可以更好地控制并发度,避免资源的过度消耗和请求的过载。 综上所述,RestTemplate结合线程池批量处理返回结果可以提升性能,适用于需要处理大量HTTP请求的场景。 ### 回答2: RestTemplate 是 Spring 框架提供的一个用于访问 RESTful 服务的 HTTP 客户端工具。当我们需要批量处理返回结果时,可以结合线程池来进行处理。 首先,我们需要创建一个线程池,可以使用 Java 提供的 ExecutorService 接口实现,比如使用 ThreadPoolExecutor 类。然后,我们将任务分成多个小任务,每个小任务使用一个线程来执行。 在每个小任务中,我们可以使用 RestTemplate 发送 HTTP 请求并获得返回结果。可以使用 RestTemplate 的 getForObject() 方法来发送 GET 请求,并将返回结果转换为指定的类型。对于 POST 请求,可以使用 postForObject() 方法来发送,并指定请求参数和返回的对象类型。 接下来,我们可以将每个小任务的结果存储在一个集合中,比如使用 ArrayList 来存储。在每个小任务的线程执行结束后,可以将结果添加到集合中。 最后,我们可以等待所有小任务的线程执行完成,并对所有结果进行汇总处理或后续操作。可以使用 ExecutorService 的 shutdown() 方法来关闭线程池。 通过使用 RestTemplate 结合线程池批量处理返回结果,可以提高程序的并发处理能力和效率。我们可以同时发起多个请求,并行处理返回结果,进而提升系统的吞吐量和性能。同时,使用线程池可以合理管理线程的创建和销毁,避免频繁的线程创建和销毁操作对系统性能的影响。 总结起来,通过结合 RestTemplate 和线程池,我们可以实现批量处理返回结果的功能,提高程序的并发处理能力和效率,从而满足大规模请求处理的需求。 ### 回答3: RestTemplate是Spring框架提供的用于进行HTTP请求的客户端工具。它可以方便地发送HTTP请求并处理返回结果。而线程池是一种线程管理机制,它可以提高程序的多线处理能力。 如果我们需要使用RestTemplate来批量发送HTTP请求,并且希望将请求的返回结果进行批量处理,可以考虑结合线程池来完成。 首先,我们可以创建一个线程池,用于管理多个线程的执行。可以使用Java提供的ExecutorService来实现。我们可以根据具体的需求来配置线程池的大小。 然后,我们可以使用RestTemplate发送多个HTTP请求。可以通过循环遍历的方式来发送多个请求。在发送请求时,将请求任务提交到线程池中执行,这样可以实现并发处理多个请求。 在执行请求的过程中,我们可以通过使用Callable接口来定义请求任务,这样可以方便地返回请求的结果。可以将每个请求任务封装成一个Callable对象,并且通过线程池的invokeAll方法来批量执行这些任务。 执行完所有的请求任务后,可以通过获取执行结果的方式来对返回结果进行处理。可以通过Future对象来获取每个请求任务的返回结果,并将结果保存在一个集合中。 最后,我们可以根据具体的业务需求来处理返回的结果集合。可以将返回的结果进行逻辑处理、持久化存储等操作。 综上所述,我们可以通过将RestTemplate和线程池相结合,实现批量处理多个HTTP请求的返回结果。这样可以提高程序的并发处理能力,并且方便地对返回结果进行批量处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值