Java 多个ExecutorService.execute()调用。线程池。冗余

Java 多个ExecutorService.execute()调用。线程池。冗余,java,asynchronous,executorservice,Java,Asynchronous,Executorservice,我正在使用java.util.concurrent.ExecutorService,我想知道意外的冗余使用是否会占用更多资源,或者只是速度较慢。我是说如果我想跑 executor.execute(() -> executor.execute(() -> something()); 知道我正在使用线程池,执行者将从中选择,我不确定执行上述代码后他会做什么 它是否有不良副作用,还是需要更多的资源来执行? 或者执行器如何在池和调用线程之间进行选择?(该命令可以在新线程、池线程或调用线程中

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

executor.execute(() -> executor.execute(() -> something());
知道我正在使用线程池,执行者将从中选择,我不确定执行上述代码后他会做什么

它是否有不良副作用,还是需要更多的资源来执行? 或者执行器如何在池和调用线程之间进行选择?(
该命令可以在新线程、池线程或调用线程中执行,[..]


关于Lukas

否,执行器不会检查您是否已经在线程中,因为总是这样! 您可以使用调试器查看它

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

你引用了文件,我想你误解了这句话。 它们是关于您的任务(可运行、可调用…)将在何处执行

  • 新线程:执行器将创建一个新线程
  • 池线程:执行器将对任务进行排队,并且在可能的情况下,它的线程池中的一个线程将接受该任务(池线程从不停止,您可以避免创建过程)
  • 调用线程:在调用execute()的线程上执行它
编辑: 关于您的代码,将发生的事情非常简单:

  • 执行器将任务排队,这里是lambda
  • 线程池中的一个线程将尽快执行此任务(队列在线程之间共享,因此在场景后面有信号量/同步)
  • lambda在线程内执行,最终任务将排队
  • 线程池中的线程将尽快执行此任务
  • 最后调用函数something() 没有“坏的副作用”,但不必要的开销。
    而且,遗嘱执行人没有选择任何东西。这取决于从Executors类中的任何静态方法实例化的executor。由您选择是否需要线程池、单线程或当前线程。不,执行者不会检查您是否已经在线程中,因为情况总是如此! 您可以使用调试器查看它

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

    你引用了文件,我想你误解了这句话。 它们是关于您的任务(可运行、可调用…)将在何处执行

    • 新线程:执行器将创建一个新线程
    • 池线程:执行器将对任务进行排队,并且在可能的情况下,它的线程池中的一个线程将接受该任务(池线程从不停止,您可以避免创建过程)
    • 调用线程:在调用execute()的线程上执行它
    编辑: 关于您的代码,将发生的事情非常简单:

  • 执行器将任务排队,这里是lambda
  • 线程池中的一个线程将尽快执行此任务(队列在线程之间共享,因此在场景后面有信号量/同步)
  • lambda在线程内执行,最终任务将排队
  • 线程池中的线程将尽快执行此任务
  • 最后调用函数something() 没有“坏的副作用”,但不必要的开销。
    而且,遗嘱执行人没有选择任何东西。这取决于从Executors类中的任何静态方法实例化的executor。您可以选择是使用线程池、单线程还是当前线程

    执行器
    获得哪个执行器?从
    执行器
    获得哪个执行器?我很感谢您的回答,但我知道这一点。我会把我的问题编辑得更具体一些,所以我回答:)它回答了你的问题吗?我很感激你的回答,但我知道这一点。我将编辑我的问题,使之更具体,因此我回答:)它回答了你的问题吗?