当前位置: 首页 > 网络应用技术

异步和未来异步编程机制和功能分析说明说明

时间:2023-03-07 17:00:26 网络应用技术

  在实际战斗之前,让我简要介绍未来模式的核心思想!

  未来模式的核心思想是异步呼叫。当我们执行一种方法时,如果有多个时间 - 耗费的任务同时执行,而不是急于等待此结果,请立即返回客户然后在后台缓慢计算任务。当然,您还可以选择等待这些任务被执行,然后返回客户端。

  如果我们需要在春季/跳板上实现异步编程,Spring提供的两个注释将非常简单。

  如果taskexecutor不定定义执行程序,Spring将创建一个简单的nctaskexecutor并使用它。

  自定义AsyncconFigurerThreadPooltasKexecutor是常见的概念。通常,队列大小不会设置为:integer.max_value,也不会将核心线程设置为相同的大小。在这种方式中,也无法确定当前CPU和内存利用的特定情况。

  如果队列已满,并且同时运行的线程数达到最大线程数,则如果有新任务,将会发生什么?Spring使用threadpoolexecutor.abortpolicy.abortpolicy(threadpoolexececutor将丢弃recubl exexeCutionException以拒绝新任务您将失去此任务的处理。)

  对于缩放应用程序,建议使用threadpoolexecutor.callerrunspolicy。当填充最大的池时,该策略为我们提供了可伸缩的队列。

  线程pooltaskexecutor饱和策略定义:如果同时运行的线程的当前线程数达到最大线程数,则ThreadPooltasKexecutor定义了一些策略:

  将此方法添加到@Async注释中,以告诉Spring这是一种异步方法。此外,此方法的返回值是完整的future.completedfuture(结果)。这意味着我们需要返回结果,也就是说,程序必须在返回用户之前完成任务执行。

  请注意完整的FutureTask方法中的第一行打印日志。稍后将在分析程序中使用,这非常重要!

  询问此界面,控制台打印以下内容:

  首先,我们可以看到处理所有任务的时间大约是1 s。这与我们的自定义螺纹倍数相关。我们配置的核心线程数为6,然后通过以下代码仿真分配了6个任务。,因此处理6个任务的总时间为1 S.

  尝试将核心线程的数量更改为3,然后再次询问此接口。您会发现处理所有任务的时间约为2 s。

  在特殊情况下无需返回价值。从上面的结果可以看出,所有任务完成后都会返回结果。这种情况对应于我们需要将结果归还给客户端请求的情况。如果我们不需要将任务执行结果归还给客户端怎么办?例如,我们将大文件上传到系统。上传后,只要大文件格式满足要求,我们就会成功上传。在正常情况下,我们需要等待文件上传并返回用户消息,但是它将非常慢。如果您使用异步,当用户上传时,他立即返回用户消息,然后系统将默默处理上传任务。这也会增加一些麻烦,因为文件可能会失败,因此系统也需要一些机制。补偿这个问题。例如,当上传遇到问题时,请发送消息以告知用户。

  以下将证明客户无需返回的情况:

  完整的FutureTask方法已更改为void类型控制器代码:请求此接口,控制台打印以下内容:

  您可以看到系统将直接返回用户,然后系统真正启动任务。

  作者:Li Haoyu Alex