我们在java中有三种不同的多线程技术 - Fork / Join pool,Executor Service& CountDownLatch
分叉/加入泳池(http://www.javacodegeeks.com/2011/02/java-forkjoin-parallel-programming.html)
Fork / Join框架旨在使分而治之的算法易于并行化。这种类型的算法非常适合于可以分为两个或更多相同类型的子问题的问题。他们使用递归将问题分解为简单的任务,直到这些变得足够简单直接解决。然后组合子问题的解决方案以给出原始问题的解决方案
ExecutorService 是一个扩展Executor类并表示异步执行的接口。它为我们提供了管理结束和检测异步任务进度的机制。
invokeAll():执行给定的任务,在完成所有任务后返回持有其状态和结果的Futures列表。对于返回列表的每个元素,Future.isDone()都为true。
CountDownLatch :(http://examples.javacodegeeks.com/core-java/util/concurrent/countdownlatch-concurrent/java-util-concurrent-countdownlatch-example/)
CountDownLatch用于同步,以允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。
我的假设:
在这两种选择中,只有在完成所有任务/线程后才能知道最终结果。
这三种选择是互补的还是互补的 ?
答案 0 :(得分:7)
在研究过去3个月的各种多线程框架之后,我找到了问题的答案。
控制有限,简单易用。你可以用它
当Callable/Runnable
任务的数量很少而且无限制队列中的任务堆积不会导致内存堆积增加时,我更喜欢这个。降低系统的性能。
它隐藏了ThreadPoolExecutor
的低级细节。它不允许使用其他参数(Bounded Queue, Rejection Handler
等来微调性能),如ThreadPoolExectuor
中所示。
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler)
它为您提供更多控制权。除了设置最小和最大线程外,您还可以设置队列大小,并使BlockingQueue
有界限。
如果您需要以下功能,可以提供自己的线程工厂
如果您的应用程序受到待处理的Runnable / Callable任务数量的限制,您将通过设置最大容量来使用有界队列。队列达到最大容量后,您可以定义RejectionHandler。 Java提供了四种类型的拒绝处理程序policies。
在默认的ThreadPoolExecutor.AbortPolicy
中,处理程序在拒绝时抛出运行时RejectedExecutionException。
在ThreadPoolExecutor.CallerRunsPolicy
中,调用execute本身的线程运行任务。这提供了一种简单的反馈控制机制,可以降低新任务的提交速度。
在ThreadPoolExecutor.DiscardPolicy
中,简单地删除了无法执行的任务。
在ThreadPoolExecutor.DiscardOldestPolicy
中,如果执行程序未关闭,则会删除工作队列头部的任务,然后重试执行(可能会再次失败,导致重复执行)。 )
CountDownLatch
:这个框架允许java线程等到其他线程集完成任务。
用例:
实现最大并行度:有时我们希望同时启动多个线程以实现最大并行度
在开始执行其他代码块之前等待N个线程完成
死锁检测。
ForkJoinPool
与Java ExecutorService类似,但有一点不同。 ForkJoinPool
使任务可以轻松地将其工作分成较小的任务,然后将这些任务提交给ForkJoinPool。当忙工作线程从繁忙的工作线程队列中窃取任务时,在ForkJoinPool中发生任务窃取。
public ForkJoinPool(int parallelism,
ForkJoinPool.ForkJoinWorkerThreadFactory factory,
Thread.UncaughtExceptionHandler handler,
boolean asyncMode)
Creates a ForkJoinPool with the given parameters.
参数:
parallelism - 并行度级别。对于默认值,请使用Runtime.availableProcessors()
。
factory - 用于创建新线程的工厂。对于默认值,请使用 defaultForkJoinWorkerThreadFactory。
handler - 因不可恢复的错误而终止的内部工作线程的处理程序
asyncMode - 如果为true,则建立本地先进先出调度模式 对于从未加入的分叉任务。
关于主要查询:
您可以使用ExecutorService.invokeAll()
或CountDownLatch
框架或ForkJoinPool
。所有这些框架互不相同,以控制任务从高级到低级的执行。
<强> 编辑: 强>
查看相关的SE问题: