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

叉 /加入使用学习

时间:2023-03-06 02:20:15 网络应用技术

  JDK7提供了一个用于“分割和管理” -Fork/Join的框架从两个末端队列执行任务。子任务的结果在另一个队列中完成,从队列启动线程以拾取数据,然后合并数据。

  叉/联接的想法如下所示:

  RecursivEtask适用于将任务和返回值分开。例如,计算1至100总和的示例:

  forkjoinpool使用提交或调用:Invoke是同步执行之间的差异。打电话后,您需要等待任务完成任务,然后才能执行代码。提交是异步的,只有在将来的电话得到时才。

  启动程序输出如下:

  5050

  实际上,执行子任务呼叫方法不是最佳选择。最好的选择是InvokeAll方法:

  用法方法类似于递归情节,但是没有回报值:

  输出结果也为5050。

  叉/联接框架是在包装下实施的,其核心有4个类别:

  基本上,我们解决问题的代码是执行或中间的,然后将任务提交给Forkjoinpool`处理各种问题,例如使用线程管理对多核处理器的使用。

  让我们首先了解这些类中的关键方法。

  这是运行的抽象任务类。该类型指定任务的返回结果。ForkJointask是类似于线程的实体,这意味着任务是轻量级抽象,而不是实际的执行线程。此机制允许少量数量实际线程以在forkjoinpool中以少量实际线程管理大量任务。关键方法是:

  方法提交并执行异步任务。此方法返回并调用线程继续运行。

  等待任务的方法,直到返回结果为止。

  该方法是组合,它开始任务并等待返回结果的结束。

  此外,中国还提供两种静态方法来一次调用多个任务

  这是递归子类的类别,而无需返回结果。这意味着可以按部门策略将任务分为您自己的子任务(在下一部分中,您将看到如何分配代码示例)。

  我们必须重写该方法并在其中编写计算代码:

  相同,但是有返回的结果,并且指定了结果类型。我们仍然需要重写:

  这是叉/联接框架的核心类别。它负责线程的管理和执行。为了执行,需要先获得的实例。

  有两个示例可以由两个构造函数获得。构造函数创建的首次使用:

  平行级别确定可以执行的线程的数量。换句话说,它确定可以同时执行的任务数 - 但不能超过处理器的数量。

  但是,这并不限制池可以管理的任务数量。ForkjoInpool可以管理比并行级别更多的任务。

  获得ForkJoinPool实例的第二种方法是使用以下静态方法的forkjoinpool来获取公共池实例:

  以这种方式创建的池不受该方法的影响,而是会自动暂停。任何依赖异步任务处理的过程都应在暂停主程序之前调用该方法。该方法是静态的,可以自动使用。

  工作媒体算法是指其他队列中线程的被盗任务。

  那么,为什么我需要使用窃取算法的工作呢?如果我们需要执行相对较大的任务,我们可以将此任务分为几个非依赖性的子任务。为了减少线程之间的竞争,这些子任务被放入不同的队列中,对于每个queuecreate,一个单独的线程以在队列中执行任务。线程和队列对应于一个-to -One对应。其他线程,因此将其窃取其他线程的队列以窃取任务以执行。通常使用末端队列。窃取任务的线程将始终从两个末端队列的尾部执行任务。

  窃取算法的工作优点在于,它充分利用线程来执行并行计算并减少线程之间的竞争。缺点是在某些情况下仍然存在竞争,例如两个末端队列中的一个任务。并消耗更多的系统资源,例如创建多个线程和多个两个末端队列。

  以上只是为了证明叉/联接的用法。实际上,计算此方法是更多的时间。由于削减任务,线程的分配需要其他开销。毫不犹豫地选择它!