java - 当有线程调度程序时,执行线程如何并发运行?

标签 java multithreading scheduler runnable

根据我读过的定义:

threads are basically pieces of code that are running concurrently (at the same time).

但是,它们如何在线程调度程序存在的情况下同时运行呢?

我读到,线程调度程序基本上是从Runnable线程池中随机选择一个线程在某个时刻运行。由此我得知,在一个精确的时间点,只有一个可运行线程真正处于运行状态(正在运行)。 (所有这些都来自 SCJP Sun 认证程序员学习指南)任何人都可以澄清这一点吗?

这些线程真的并发运行吗?

最佳答案

However how can they be running concurrently with the existence of a thread scheduler?

它们并不总是并发运行,调度程序的工作是交换正在运行的线程,以便它们看起来是并发运行的。也就是说,速度太快,你看不到。

调度程序使用 0.1 毫秒的时间片。您只能看到 10 - 25 毫秒的闪烁,所以这对于您来说太快了,但它正在快速交换线程,因此看起来存在并发。

例如你不会看到电影从一帧跳到下一帧。每帧每 1/42 秒更改一次,因此您认为看到了运动,但实际上对于高速摄像机,屏幕看起来会跳动。

如果您有一个逻辑 CPU,则所有线程都将交换到一个 CPU。如果您有多个逻辑 CPU,则一小部分可以同时运行,其余的必须等待。

关于java - 当有线程调度程序时,执行线程如何并发运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24646417/

相关文章:

Java 多线程中的 volatile 关键字

multithreading - 使用静态和非静态方法从类中进行线程化

java - 使用带有 Select IN 的 Spring JdbcTemplate 返回 List<String>

用于验证用户 ID 的 Java 正则表达式。

java - "javax.servlet.request.X509Certificate"请求属性不返回CA证书

java - 设置 javacc 以使用命令提示符

java - Android中的多线程实时摄像头处理

python - Python 中是否有类似于 Ruby 的 Rufus-Scheduler 的内存作业调度程序

go - 为什么Golang调度器使用两个队列(全局运行队列和本地运行队列)来管理goroutine?

c - 在 task_struct (sched.h) 中添加新变量破坏鼠标 LINUX 内核