gpt4 book ai didi

java - 可以重新安排被阻塞的线程来做其他工作吗?

转载 作者:行者123 更新时间:2023-12-03 23:33:15 29 4
gpt4 key购买 nike

如果我有一个线程被阻塞等待锁定,操作系统是否可以重新安排该线程执行其他工作,直到锁定可用?据我了解,它不能被重新安排,它只是闲置直到它可以获取锁。但这似乎效率低下。如果我们有 100 个任务提交给 ExecutorService,并且池中有 10 个线程:如果其中一个线程持有锁,而其他 9 个线程正在等待该锁,那么只有持有锁的线程才能取得进展。我原以为可以暂时重新安排被阻塞的线程来运行其他一些提交的任务。

最佳答案

你说:

I would have imagined that the blocked threads could be temporarily rescheduled to run some of the other submitted tasks.

织机项目

您碰巧正在描述作为Project Loom 的一部分开发的虚拟线程(纤程)。用于 Java 的 future 版本。

目前,Java 的 OpenJDK 实现使用来自主机操作系统的线程作为 Java 线程。所以这些线程的调度实际上是由操作系统而不是 JVM 控制的。是的,正如您所描述的,在所有常见的操作系统上,当 Java 代码阻塞时,代码的线程处于空闲状态。

Project Loom 在“真实”平台/内核线程之上分层虚拟线程。许多虚拟线程可以映射到每个真实线程。在通用硬件上运行数百万个线程是可能的。

使用 Loom 技术,JVM 可以检测阻塞代码。该阻塞代码的虚拟线程被“停放”,搁置一边,另一个虚拟线程分配给该真实线程以完成一些执行时间,而停放的线程等待响应。这种 parking 和切换非常迅速,开销很小。在 Loom 技术下,阻塞变得非常“便宜”。

阻塞在大多数面向业务的普通应用程序中很常见。阻塞发生在文件 I/O、网络 I/O、数据库访问、日志记录、控制台交互、GUI 等等。通过 Project Loom 的实验性构建,此类使用虚拟线程的应用程序看到了巨大的性能提升。这些构建现在可用,基于早期访问 Java 17。Project Loom 团队寻求反馈。

使用虚拟线程非常简单:切换您选择的执行器服务。

ExecutorService executorService = Executors.newVirtualThreadExecutor() ;

警告:如 commented by Michael ,JVM管理的虚拟线程依赖于主机操作系统管理的平台/内核线程。最终,即使在 Loom 下,操作系统也会安排执行。当阻塞的 Java 线程在 CPU 内核上处于空闲状态时,虚拟线程非常有用。如果主机负载过重,Java 线程可能会看到很少的执行时间,不管有没有虚拟线程。

虚拟线程不适合很少阻塞的任务,真正的 CPU-bound .例如,编码视频。此类任务应继续使用常规线程。

有关详细信息,请参阅 Oracle 的 Ron Pressler 或 Loom 团队的其他成员的启发性演示和采访。随着 Loom 的发展,寻找最新的。

关于java - 可以重新安排被阻塞的线程来做其他工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67025555/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com