scala.concurrent.ExecutionContext.Implicits.global关于ExecutionContext特性的文档如下:
只需导入
scala.concurrent.ExecutionContext.Implicits.global就可以获得隐式ExecutionContext。此全局上下文是一个合理的默认线程池。
“合理违约”是什么意思?
发布于 2014-03-28 03:23:08
默认
它是一个固定大小的ThreadPool,其线程数与机器上的处理器相同。合理的违约意味着它在大多数情况下都是有益的。
是什么“好”线程池?
首先,重要的是要了解您只有机器上的内核有多少线程。所有其他线程都被称为恶魔线程,这都是为了在队列化和执行方面保持智能(在语言/库级别)。
CachedThreadPool:许多短命/廉价任务
您生成的线程池的类型在很大程度上取决于它们要执行的操作。对于许多短暂的操作(例如数据库查询),您将使用缓存的线程池。
因为每个单独的任务都比较便宜,但是生成一个新线程是很昂贵的,所以使用CachedThreadPool会更好。
FixedThreadPool:长时间运行/昂贵任务
与上述不同,对于非常昂贵的操作,您可能希望限制一次运行的线程数量,原因有多种:内存、性能等。
ForkJoinPool: Divide et impera
当您需要执行非常大的计算时,这种类型的池非常有用,但是您可以将它划分为单个工作人员可以计算的较小的位。
名单还在不停地写着。总之,Scala为您提供了上述所有内容之间的一些内容。具体来说,Scala尝试创建一个ForkJoinPool,如果第一个失败,默认为ThreadPoolExecutor。
try {
new ForkJoinPool(
desiredParallelism,
threadFactory,
uncaughtExceptionHandler,
true) // Async all the way baby
} catch {
case NonFatal(t) =>
System.err.println("Failed to create ForkJoinPool for the default ExecutionContext, falling back to ThreadPoolExecutor")
t.printStackTrace(System.err)
val exec = new ThreadPoolExecutor(
desiredParallelism,
desiredParallelism,
5L,
TimeUnit.MINUTES,
new LinkedBlockingQueue[Runnable],
threadFactory
)
exec.allowCoreThreadTimeOut(true)
exec
}}
这里的完整列表。
https://stackoverflow.com/questions/22702844
复制相似问题