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

关于并发编程,您必须知道未来的机制!

时间:2023-03-07 15:27:41 网络应用技术

  第一篇文章发表在公共帐户(每月随附的鱼)中,然后同步到掘金和个人网站:http://xiaoflyfish.cn/

  我认为有收益,希望能像它一样提供帮助,转发它,谢谢,谢谢

  Java 5在并发软件包中引入了接口,该接口类似于可运行的接口,但是它可以返回对象或抛出异常。

  可呼叫接口使用通用类型来定义其返回类型。执行者类提供了一些有用的方法来在线程池中的Callace中执行任务。由于callace任务是平行的,我们必须等待其返回的结果。线程属于异步计算模型,因此不可能直接从其他线程获得函数返回值。

  该对象为我们解决了这个问题。在线程池中提交Callace任务后,将返回一个未来对象。使用它,您可以知道可容纳任务的状态和Callace返回的执行结果。Future为我们提供了等待结束并获得其执行结果的GET()方法。

  当一定的计算时,操作过程可能是耗时的,有时会检查数据库或重型计算,例如压缩,加密等。在这种情况下,如果我们一直在等待该方法返回到位的方法,这显然是未知的。总体计划的运行效率将大大降低。

  我们可以将操作过程放在子线程上执行,然后控制子线程通过未来执行的计算过程,最后获得计算结果。

  这样,它可以提高整个程序的运行效率,这是一个异步的想法。

  同时,在JDK 1.8的文档中,对未来的描述如下:

  未来压抑了异步计算的结果。如果计算完成并返回重硫,则证明了方法。

  可能的意思是,未来是异步计算的接口。

  例如:

  例如,当您提早进食时,您可以点面包和冷菜。您需要等待3分钟,冷菜只需要1分钟。如果是连续执行的,则需要早日吃4分钟,但是如果您准备准备面包,则准备好面包。因此,您只需要等待3分钟即可。

  未来是后一种执行模式。

  我之前写过的一篇文章:要实现异步编程,您必须掌握此工具!

  当我们提交Callace任务时,我们将同时获得未来对象,然后在一定时间将未来对象的get()方法调用以获取异步执行的结果。

  当调用get()时,如果异步任务已经完成,我们将直接获得结果。如果异步任务未完成,则get()将阻止,并且在任务完成之前,该结果均未返回

  除了线程池的提交方法还返回未来对象外,您还可以使用FutureTask来获得未来类和任务的结果。

  让我们看一下FutureTask的代码实现:

  可以看出,它实现了一个接口,这称为RunnableFuture。

  让我们看一下RunnableFuture接口的代码实现:

  由于RunnableFuture继承了可运行的接口和未来接口,因此FutureTask实现了RunnableFuture接口,因此可以将FutureTask作为线程作为可运行的线程执行,但也可以获取可callable的返回值。

  典型的用法是将可调用的实例视为futureTask构造函数的参数,生成futureTask的对象,然后将此对象用作可运行的对象,将其放在线程池中或启动线程以执行它。最后的结果。

  让我们使用代码演示:

  可以在此代码中看到,该代码首先创建了实现可可接口的任务,然后将此任务实例传递到FutureTask的构造函数中,创建了一个futureTask实例,并将此实例用作运行。,最后使用FutureTask获得结果并打印出来。

  CANCEL BOOLEAN(布尔值MayInterruptifrunning)用于取消任务。如果任务已成功取消,它将返回真实。也就是说,未来提供了三个功能:判断任务是否完成,可以中断任务,任务执行结果是IscanceedBoolean,它无法说明任务是否表示任务。已成功取消。如果任务在完成任务完成之前已成功取消,则返回true。

  Isdoneboolean无法透露该任务是否已经完成。如果任务完成,请返回true;

  GETV无法获得执行结果。此方法将被阻止。它将等到任务完成后才返回返回

  GETV(长时间,时间UNIT单元)用于获得执行结果。如果在指定的时间内未获得结果,请直接返回到null

  GET方法最重要的作用是获得任务执行的结果

  让我们看一个代码示例:

  在此代码中,主要方法已构建了一个新的10个线程池,并在提交方法中提交了一个任务。

  它的内容是先睡三秒钟,然后返回一个随机数。

  接下来,我们直接打印结果。结果是正常打印一个随机数,例如9527。

  此方法用于确定当前任务是否已完成。

  应该注意的是,如果将此方法返回到True,则意味着它已完成;如果返回错误,则意味着尚未完成。

  但是,如果您在此处返回,这并不意味着此任务已成功执行,例如任务执行到一半异常。有异常,将来不会执行此任务。它确实执行了它。它已经结束了。

  因此,当isdone方法返回true时,这并不意味着此任务已成功执行,而仅表示它已完成。

  让我们看一个代码示例。该代码如下所示:

  在此代码中,您可以看到一个线程池并将任务提交到线程池。此任务将直接引发例外。

  然后,我们使用for循环睡觉,同时让它慢慢打印五个数字为0?4。

  执行完成后,调用isdone()方法,打印此结果,然后致电

  如果您不想执行某个任务,则可以使用取消方法。将有三种情况:

  判断是否被取消是相对简单的,使用取消方法更简单。

  目前,我们经常使用这些类别:我们经常使用:

  瓜瓦

  可聆听的未来,通过增加听众来立即获得结果,并立即获得结果,而无需循环查询

  完整的未来

  java8的完整图,然后使用当时,随后,applyasync可以达到类似于番石榴的链条呼叫效果。

  不同之处在于,对于Java8,如果当时的Applyasync不在线程池上传递,它将使用Forkjoinpools线程池执行相应的方法,以避免对其他线程的影响。

  我之前写过的一篇文章:要实现异步编程,您必须掌握此工具!

  网

  Netty解决的问题:

  与JDK相比,添加了完成状态的细分,并添加了侦听器。在异步线结束后,可以触发一系列动作。

  假设有四个任务要执行,我们都将其放在线程池中,然后在获得1到4的顺序中获得,即执行get()方法

  代码如下:

  可以看出,我们已经在代码中构建了一个新的线程池,并使用列表来节省4个未来。

  其中,与前两个未来相对应的相应任务是慢速任务,即,在代码下方的slowtask,与两个未来相对应的相应任务是快速任务。

  当执行缓慢的任务完成时,要执行5秒钟,并且可以尽快执行快速任务,几乎没有时间。

  提交这4个任务后,我们使用FO循环依次执行GET方法来获得其执行结果,然后打印此结果。

  实际上,执行时将等待5秒钟,然后快速打印这4行句子。

  所以问题是:

  第三个任务相对较小。它可以快速返回结果,然后第四任务将返回结果。

  但是,由于前两个任务非常慢,所以当我们使用get方法时,我们会陷入第一个任务。为了获得循环获得结果,我们仍然无法及时获得第三和第四个。第二个任务的结果,然后是第三任和第四任务。

  假设由于网络原因,第一个任务可能无法返回结果长达1分钟。然后,此时,我们的主线程将始终陷入困境,从而影响程序的运行效率。

  目前,我们可以通过将来带来加班参数的方法来解决此问题。

  该方法的作用是,如果在有限的时间内未返回结果,则将抛弃超时访问,然后您可以捕获此异常或将其扔掉。

  特定实施类:FutureTask

  get()方法可以分为两个步骤:

  下一步有两种情况:

  我认为有收益,希望能像它一样提供帮助,转发它,谢谢,谢谢

  微信搜索:一月与飞鱼,结交朋友,输入面试和交流小组

  公共帐户背景回复666,您可以获取免费的电子书籍

  原始:https://juejin.cn/post/709750394682605711