首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中,新线程是否自动分配给不同的CPU核心?

在Java中,新线程是否自动分配给不同的CPU核心?
EN

Stack Overflow用户
提问于 2015-11-09 22:33:54
回答 3查看 1.8K关注 0票数 8

在Java中,更具体地说,在Android中,新线程是否会自动分配到与我目前正在使用的CPU内核不同的CPU内核,或者应该由我来处理呢?

另外,如何创建新线程,使用thread类还是将一个可运行的线程提交给一个可维护线程池的执行器,这有关系吗?

这里有一个类似的问题,但答案继续解释了OP应该如何解决他的特定问题,而不是深入研究更一般的情况:线程自动使用多CPU核心?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-09 22:37:06

在Java中,更具体地说,在Android中,新线程是否会自动分配到与我目前正在使用的CPU内核不同的CPU内核,或者应该由我来处理呢?

操作系统本身在什么内核上运行线程的决定(在Android中,基于Linux调度程序)。你不能亲自影响这些决定;决策是自动的和动态的。

如何创建新线程,使用thread类还是将可运行的线程提交给一个可维护线程池的执行器,这有关系吗?

关于线程运行在什么内核上,操作系统既不知道也不关心是否涉及Executor,或者即使应用程序所用的编程语言有Executor

票数 9
EN

Stack Overflow用户

发布于 2015-11-10 06:11:47

在Java中,更具体地说,在Android中,新线程是否会自动分配到与我目前正在使用的CPU内核不同的CPU内核,或者应该由我来处理呢?

中,线程只是单独的执行序列,但是在Android中,它比这要复杂一些。Android为每个应用程序创建一个主线程。这个主线程负责、UI、和其他与事件(队列)相关的任务。要进行后台工作,必须创建单独的工作线程。

简单的线程由Android自动处理,它们可能运行,也可能不运行在单独的核心上。如果您正在运行10个线程,则很可能它们都运行在一个核心上,而其他所有内核都处于空闲状态。

如果您需要运行多个线程和,您需要在一个单独的核心上运行每个线程,您应该使用ThreadPoolExecutor;它将处理线程创建,并将其映射到可用的CPU核数上。您可以根据需要设置各种参数。看看Android在说什么:

ThreadPoolExecutor将根据corePoolSize (参见getCorePoolSize())和maximumPoolSize (参见getMaximumPoolSize())设置的界限自动调整池大小(参见getMaximumPoolSize())。当在方法execute(Runnable)中提交新任务时,并且运行的少于corePoolSize线程,就会创建一个新线程来处理请求,即使其他工作线程处于空闲状态。如果运行的线程多于corePoolSize,但少于maximumPoolSize线程,则只有当队列已满时,才会创建新线程。

有关细节,请参见ThreadPoolExecutor

如何创建新线程,使用thread类还是将可运行的线程提交给一个可维护线程池的执行器,这有关系吗?

是的,见上面的答案。

更新

通过说“在一个单独的核心上运行每个线程使用ThreadPoolExecutor",我的意思是ThreadPoolExecutor可以这样做,如果它被正确地使用在一个谨慎的方式。

Java不直接在CPU上映射线程。Java在OS上保留线程调度(通过映射到OS的进程),但是我们如何创建线程会影响OS级别的调度()。然而,Java可以将优先级分配给线程,但同样需要操作系统来遵守这些优先级。

在创建线程池时,需要考虑各种参数,很少如下所示:

(一)线程的复杂性应该是相等的。

(2)比较CPU绑定任务和I/O绑定任务,I/O绑定任务通常需要比可用核心更多的线程来优化CPU的使用。

(三)线程之间的依赖对线程产生负面影响

如果创建线程时要记住这些点,那么ThreadPoolExecutor可以帮助实现100%的CPU利用率,这意味着每个内核只有一个线程(如果线程池的大小等于核心的数量,并且没有其他线程正在运行)。的优点是 of ThreadPoolExecutor与单独创建线程相比具有成本效益,同时也消除了上下文切换,这浪费了大量的CPU周期。

在并发的同时实现CPU利用率的100%,并不是一件容易的事情。

票数 4
EN

Stack Overflow用户

发布于 2019-12-17 07:31:08

无论以哪种方式创建线程(使用ThreadPoolExecutor)线程类或使用将任务提交给线程或分配给线程的任务),它都不会对OS调度产生任何影响。

在此过程中涉及到OS组件Scheduler,它负责在操作系统内部(如果内核多于一个)之间调度任务或线程。此决定由调度程序作出。

如果系统中只有一个核心,则Scheduler通过允许线程一个一个地处理几毫秒来公平地处理线程

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

https://stackoverflow.com/questions/33619592

复制
相关文章

相似问题

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