用Java线程处理长期运行的任务
#编程 #java #并发性 #线程

介绍

长期运行的任务需要一种特殊的处理方式,用户不需要等到这些任务完成,我们将受益于CPU功率和并行处理长期运行的任务以更快地完成。

什么是线程?

线程是程序执行的路径,JVM允许多个路径/线程同时工作,并且不互相干扰。

Image description

在Java中使用线程

正如我们在线程之前说的那样是一条脱落的路径,任何逻辑都必须作为线程的一部分运行,如下图。

Image description

主线程负责在主方法内部执行逻辑,并且执行必须逐行进行,而不要在完成当前一个之前移动到下一个。如上图所示,那里有一个长期运行的任务,如果主线程负责执行此逻辑,则在此方法完成执行之前不会显示结果,也许此方法根本不会影响结果,并使用户等到此方法完成是不好的。

创建自己的线程

作为Soliton的一部分,您可以定义自己的线程并将长期运行的逻辑附加并启动此路径,因此我们需要2件事:

  1. 将通过此路径运行的逻辑。
  2. 线程充当路径。

Image description

通过此,有sperate线程执行任务,主线程在他的路径中继续并打印结果。但是内联实现或匿名类是代码气味,我们必须避免使用它,而是在OOP范式中可以做到这一点

Image description

否则您可以随意使用功能范式 可运行功能接口和lambda表达式如下

Image description

空白还不够

如果您注意到可运行的接口作为运行方法的返回类型,该方法无法从该处理中返回值,但是如果我们需要从该侧面处理中的值,该怎么办。在这种情况下,您必须使用下面的可呼叫接口。

Image description

可呼叫接口具有一个通用类型,您可以将任何数据类型分配为返回类型,但不幸的是,您无法分配 callable 接口 thread 类,相反,您必须使用所谓的 executorService 类如下

Image description

如上所述,我们声明了执行人员服务,该执行人员将管理线程执行并在线程完成后获得结果,我们说我们希望该执行人最多管理1个线程,然后使用 submit( )我们将要执行的任务附加到执行人。根据我们的要求,我们要求在单独的路径上运行这项长途运行,而不要阻止该主线程,而且我们需要从该任务中的返回值。 Java所做的是向我们提供的 Future 接口,Java告诉我们,我将执行此任务并在单独的线程中执行它,然后在任务完成时进行此 Future 参考您将找到您的结果,并访问结果,您可以使用 get()方法。

如果您调用了get()方法,并且线程尚未完成执行,则主线程将被阻止,直到长期运行的任务线程完成其'执行,并且由于此get()方法抛出executionException

并行处理的执行人员服务

您还可以使用executor服务进行并行处理

的巨大数据

Image description

如上所述,我们在其'池中有3个线程有3个消息和执行人员服务,通过为每个消息构造3个任务一个,执行程序将为池中的每个线程分配一个任务,并让其启动处理,每当任何人完成时,执行您可以获得其“结果”

在这里,我们有相同数量的线程具有相同数量的任务,但是如果我们有大量的任务,执行人员服务将将前3个任务分配给其'线程,并将其余的任务搁置,直到任何线程完成并分配给另一个任务一个,依此类推

Image description

forkjoin框架

forkjoin框架也可以作为并行处理,但采用不同的方法,它使用递归方法来拆分任务,直到达到预定义的批次/大小,然后开始将此批次分配给线程以进行工作。

您可以使用更多详细信息和实施示例here

资源

如果您喜欢帖子,那么您可以给我买咖啡,谢谢。

Buy Me A Coffee