当前位置: 首页 > 知识库问答 >
问题:

java ,多个线程为什么要 “抢夺”cpu的执行权 ? 比如有4个 thread 线程,然后cpu也是4核 , 那不就是刚好 一个核对应一个线程吗 , 就不用抢夺了呀 ?

潘修为
2023-08-14

java ,多个线程为什么要 “抢夺”cpu的执行权 ? 比如有4个 thread 线程,然后cpu也是4核 , 那不就是刚好 一个核对应一个线程吗 , 就不用抢夺了呀 ?

共有7个答案

鲁宏爽
2023-08-14

即使有多个核心也并不意味着每个线程都能独占一个核心。例如,在某些情况下,一个或多个线程可能无法使用其所在的核心,例如当该核心由其他进程或线程独占时或因 CPU 调度算法而未被分配给特定的线程时。

此外,即使在程序中硬编码指定了将线程分配到特定的 CPU 核心,任何一种形式的并发都可能导致数据竞争和死锁等问题,需要进行适当的同步和协调机制来避免。

因此,即使一个系统有多个 CPU 核心,多个线程仍然需要通过竞争来获取 CPU 执行时间,以便分配给它们执行任务的时间片,从而实现并发执行。

公孙智
2023-08-14


光System线程就用200多个,随便打开几个软件就几百个线程

柴英锐
2023-08-14

1.企业微信截图_16848205034221.png
这是因为线程执行的时候可能会被打断,比如时间片用完或者等待I/O操作,还有可能会有更多的线程被创建并且要求使用CPU执行。

何睿范
2023-08-14

image.png

image.png

你看,一个简单的Web项目。活动线程33,守护线程26。


在看

public static void main(String[] args) throws InterruptedException {    while (true) {        TimeUnit.MINUTES.sleep(10);    }}

image.png


另外,你这机器不止运行Java程序。还有OS本身

傅雪松
2023-08-14

抢占式调度是一种比较常见的多任务调度方式,因为这种方式具有灵活性和高效性。

如果采用不抢占式的方式,当一个线程开始执行时,它将一直执行直到自己主动让出 CPU 的执行权,或者执行完任务并结束。此时,其他线程就只能等待当前线程执行完后才能获得 CPU 的执行权,这就会导致其他线程响应时间延长、CPU 资源利用率低下、性能下降等问题。另外,线程自行让出 CPU 的执行权也存在问题,因为线程的执行时间片无法精确控制,而且线程之间的优先级、负载和资源占用等情况不容易准确确定,可能会导致死锁、饥饿等问题。

相比之下,抢占式调度可以更加灵活和高效地利用 CPU 资源。通过时间片轮转、优先级调度等方式,可以保证所有线程都能够公平地竞争 CPU 的执行权,并且能够及时地切换到其他线程进行执行。这样,就可以避免线程之间出现长时间阻塞、响应延迟等问题,提高系统的并发性和资源利用率。因此,抢占式调度在实际应用中被广泛采用。

芮瑾瑜
2023-08-14

1、首先要区分CPU是多处理器架构,还是多核心架构 这是两种不同的处理器架构
多处理器架构是指多个cpu核心分别有自己的一套Cache和MMU
多核心架构是指多个cpu核心共用一套Cache和MMU
多处理器架构可以并行 多核心架构只能并发
现代的CPU基本上都实现了多处理器架构,所以可以实现并行
你可以看一下这篇回答里用户“勇往直前”的回答[https://www.zhihu.com/question/271821176]
这个回答引用了哈工大李治军的《操作系统》
2、你说的线程“抢夺”cpu的执行权,一般是指多个线程被操作系统分配到同一个cpu核心上执行的情况,而不是你说的这种线程在同一数量cpu核心数的前提下执行任务的情况,操作系统肯定是优先把能用的cpu资源分配给能够应付的线程的,能均分更好(也就是说如果按你题目的假设来说,你的说法是正确的)。如果一直让一个线程霸占着核心直到它做完任务为止,一是资源浪费 二是有可能这个线程会陷入死循环 系统会出现假死的情况 所以现代操作系统一般使用时间片轮转调度算法,也就是隔一段时间就切换一个进程来执行任务 这个进程里的线程之间就可能存在竞争所在进程资源的情况(它们之间同样使用时间片轮转调度算法来进行切换,事实上在类Unix操作系统比如Linux里,进程和线程之间的界限被模糊了,它们都是“任务”),同一时间一个cpu核心只能执行一个线程的任务,剩下的线程在当前执行的线程的时间片执行完后当然就要去抢夺cpu的执行权了,但是最终谁能抢到执行权就不一定了,线程之间是共享进程的资源的,对于它们自己而言只想赶紧拿到资源完成自己的任务,自然就要打架来获得执行权了。

令狐良骏
2023-08-14

那要是再多怎么怎么办

 类似资料:
  • 问题内容: 假设我的应用程序运行2个线程(例如渲染线程和游戏更新线程)。如果它运行在具有多核CPU的移动设备上(当今通常是这样),我是否可以期望在可能的情况下自动将线程分配给不同的内核? 我知道底层的OS内核(Android linux内核)决定调度。我的问题是我是否需要做 任何其他事情 才能启用多核功能,还是自动而透明的? 问题答案: 您需要做的是允许两个线程尽可能独立地运行。如果您有两个始终在

  • 基于每个JVM的CPU核数创建线程与在多个JVM上运行的线程在CPU核数上创建线程数,条件是所有JVM运行在共享同一CPU的一个物理系统上有何不同?换句话说,一个并行运行8个线程的多线程Java程序vs在共享同一CPU的8个不同JVM上运行的同一多线程程序? 下面我给出了一些我发现的用线程实现并行处理的方法,但是我不能理解它们之间的本质区别? 方法一:线程周期性地查询数据库更改,并行地启动(长时间

  • 问题内容: 有人可以提供解释,说明当JVM仅是Linux上的单个进程时,Java多线程程序(例如Tomcat servlet容器)如何能够使用CPU的所有内核?有没有很好的深入文章详细介绍了该主题? 编辑#1 :我不是在寻找有关如何在Java中实现多线程程序的建议。我正在寻找有关JVM如何在Linux / Windows上内部管理以使用多个内核而仍是OS上的单个进程的解释。 编辑#2 :我设法找到

  • 我试着运行一个程序,使用线程显示带有数字的乘法、除法、加法和减法表。 但是我希望数字被乘以或相加等。由用户选择。 也就是说,程序应该在用户为每个操作选择一个数字后运行,然后显示结果。

  • 我运行一个大型的minecraft服务器,minecraft服务器端是单线程的。一切都是在主游戏循环中完成的。如果Mojang使minecraft服务器端多线程化,minecraft服务器每年将节省200万美元,因为租用的硬件更少。 不管怎样,我听说过这些谣言和理论。我从来都无法用谷歌搜索并弄清楚。 有没有必要使用多核cpu,并将其转换为单核、单线程? 我一直在猜测虚拟机管理程序软件将运行多线程,

  • 问题内容: 假设您的Java程序占用了100%的CPU。它有50个线程。您需要查找哪个线程有罪。我没有找到可以提供帮助的工具。当前,我使用以下非常耗时的例程: 运行,其中pid是Java进程的进程ID。找到它的简单方法是运行JDK-中包含的另一个实用程序。最好将jstack的输出重定向到文件。 搜索“可运行”线程。跳过那些在套接字上等待的对象(由于某些原因,它们仍被标记为可运行)。 重复步骤1和2