【问题标题】:multiple ExecutorService.execute() calls. Threadpool. Redundancy?多个 ExecutorService.execute() 调用。线程池。冗余?
【发布时间】:2020-07-15 15:27:53
【问题描述】:

我正在使用java.util.concurrent.ExecutorService,我想知道意外的冗余使用是否会使用更多资源或者只是速度较慢。我的意思是如果我会跑

executor.execute(() -> executor.execute(() -> something());

知道我使用的是 ThreadPool,Executor 会从中选择,我不确定他在执行上述代码后做了什么。

它有不好的副作用还是需要更多资源来执行? 或者Executor如何在池和调用线程之间进行选择?(The command may execute in a new thread, in a pooled thread, or in the calling thread,[..])

问候卢卡斯

【问题讨论】:

  • 你从Executors得到哪个执行者?

标签: java asynchronous executorservice


【解决方案1】:

不,执行器不会检查你是否已经在一个线程中,因为它总是这样! 你可以用调试器看到它​​。

它会更慢并使用更多资源。创建线程是一个漫长的过程(从 CPU 的角度来看),线程过多会使 CPU 一直在更改上下文并降低性能。

您引用了文档,我认为您误解了这句话。 它们与您的任务(Runnable、Callable...)将在何处执行有关。

  • 新线程:执行器将创建一个新线程
  • 池化线程:执行器将任务排队,并且它的线程池中的一个线程将尽可能地接受它(池化线程永远不会停止,您可以避免创建过程)
  • 调用线程:在调用execute()的线程上执行

编辑: 关于您的代码,将会发生的事情非常简单:

  1. 执行器将任务排队,这里是一个 lambda。
  2. 线程池中的一个线程会尽快接手这个任务(队列是跨线程共享的,所以幕后有信号量/同步)
  3. lambda 在线程内部执行,最终的任务将被排队。
  4. 线程池中的一个线程将尽快完成此任务
  5. 最后你的函数 something() 被调用了!

没有“不好的副作用”,而是不必要的开销。 此外,执行者不选择任何东西。这取决于您从 Executors 类中的任何静态方法实例化的执行器。线程池、单线程还是当前线程由您选择

【讨论】:

  • 感谢您的回答,但我知道这一点。我将编辑我的问题,使其更具体
  • 所以我回答了:) 它回答了你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 2011-09-23
  • 2011-06-21
相关资源
最近更新 更多