Java 这是否意味着使用newSingleThreadExecutor()将在每个任务的同一CPU核上执行给定的任务?

Java 这是否意味着使用newSingleThreadExecutor()将在每个任务的同一CPU核上执行给定的任务?,java,multithreading,threadpoolexecutor,java-threads,Java,Multithreading,Threadpoolexecutor,Java Threads,假设我有singleThreadExecutor,我“给”它10个任务。那些任务将存储在BlockingQueue中,并将一个接一个地执行。因此,在Java中,我们有1个线程将一个任务一个任务地执行,直到它完成所有10个任务为止 我的问题是,这是否意味着给定的Java线程将一直在同一CPU内核上运行?在这种情况下有什么希望吗 还有一件事。有人能告诉我这与1个Java线程不等于1个CPU线程有关吗?我说对了吗?我找不到合适的术语,所以对最后一件事的任何引用都会有所帮助:)我记得我以前读过类似的文章

假设我有
singleThreadExecutor
,我“给”它10个任务。那些任务将存储在
BlockingQueue
中,并将一个接一个地执行。因此,在Java中,我们有1个线程将一个任务一个任务地执行,直到它完成所有10个任务为止

我的问题是,这是否意味着给定的Java线程将一直在同一CPU内核上运行?在这种情况下有什么希望吗


还有一件事。有人能告诉我这与1个Java线程不等于1个CPU线程有关吗?我说对了吗?我找不到合适的术语,所以对最后一件事的任何引用都会有所帮助:)我记得我以前读过类似的文章。

java中的多线程只是一种逻辑并行计算的方法。如果我们谈论的是CPU核心使用率等,那么根本无法保证执行顺序或核心使用率。一个java线程甚至可能在多个CPU核上被超越。这由CPU决定,而且不可预测,因此最好将其视为一个神奇的黑匣子,而不是您可以通过编程习惯/模式影响的东西。当然,Java线程不等于1个CPU线程。CPU线程是一个硬件处理器。Java线程是一堆过程调用。这个问题太麻烦了。当您在一个线程上执行一个任务时,无法保证该任务将在同一个CPU内核上运行。如果你不知道的话,你可以开始问这个问题。然后,当您在该线程上执行十个任务而不是一个任务时,这一点不会改变;当您使用executor服务抽象/封装该线程时,这一点也不会改变。
BlockingQueue
也不会对此产生任何影响。顺便说一句,没有人保证所有10个任务都会在同一个线程中执行。线程池在线程在任务执行期间死亡时重新创建线程: