多次 ExecutorService.execute() 调用。线程池。冗余?

multiple ExecutorService.execute() calls. Threadpool. Redundancy?

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

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

知道我用的是ThreadPool,Executor会选择ThreadPool,不知道他执行完上面的代码后做了什么。

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

问候卢卡斯

不,执行器不会检查您是否已经在线程中,因为情况总是如此! 你可以用调试器看到它​​。

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

你引用了文档,我想你误解了这句话。 它们是关于您的任务(Runnable、Callable...)将被执行的位置。

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

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

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

没有“不良副作用”,但有不必要的开销。 此外,执行者不选择任何东西。这取决于您从执行器 class 中的任何静态方法实例化的执行器。是你要线程池,单线程还是current