首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scala.concurrent.ExecutionContext.Implicits.global?的行为是什么?

scala.concurrent.ExecutionContext.Implicits.global?的行为是什么?
EN

Stack Overflow用户
提问于 2014-03-28 02:04:24
回答 1查看 6.6K关注 0票数 21

scala.concurrent.ExecutionContext.Implicits.global关于ExecutionContext特性的文档如下:

只需导入scala.concurrent.ExecutionContext.Implicits.global就可以获得隐式ExecutionContext。此全局上下文是一个合理的默认线程池。

“合理违约”是什么意思?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-28 03:23:08

默认

它是一个固定大小的ThreadPool,其线程数与机器上的处理器相同。合理的违约意味着它在大多数情况下都是有益的。

是什么“好”线程池?

首先,重要的是要了解您只有机器上的内核有多少线程。所有其他线程都被称为恶魔线程,这都是为了在队列化和执行方面保持智能(在语言/库级别)。

CachedThreadPool:许多短命/廉价任务

您生成的线程池的类型在很大程度上取决于它们要执行的操作。对于许多短暂的操作(例如数据库查询),您将使用缓存的线程池。

因为每个单独的任务都比较便宜,但是生成一个新线程是很昂贵的,所以使用CachedThreadPool会更好。

FixedThreadPool:长时间运行/昂贵任务

与上述不同,对于非常昂贵的操作,您可能希望限制一次运行的线程数量,原因有多种:内存、性能等。

ForkJoinPool: Divide et impera

当您需要执行非常大的计算时,这种类型的池非常有用,但是您可以将它划分为单个工作人员可以计算的较小的位。

名单还在不停地写着。总之,Scala为您提供了上述所有内容之间的一些内容。具体来说,Scala尝试创建一个ForkJoinPool,如果第一个失败,默认为ThreadPoolExecutor。

代码语言:javascript
复制
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
}

}

这里的完整列表。

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22702844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档