V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

请问 Java 中线程被阻塞(sleep,join)之类的,对应内存中会有什么变化呢?

  •  
  •   Newyorkcity · 2020-04-10 19:42:50 +08:00 · 855 次点击
    这是一个创建于 1683 天前的主题,其中的信息可能已经有所发展或是发生改变。
    线程张三被阻塞,意味着张三的所有资源(它的栈,指令计数器和本地方法栈?)从 CPU 缓存压回主存,然后从主存提一个不被阻塞的线程李四的资源上来,跑这个线程?

    谢谢
    4 条回复    2020-04-10 22:33:32 +08:00
    zxlzy
        1
    zxlzy  
       2020-04-10 19:48:21 +08:00   ❤️ 1
    这个叫做上下文切换(context switch)。和你说的差不多一个意思,不过不叫资源,叫上下文。
    Newyorkcity
        2
    Newyorkcity  
    OP
       2020-04-10 20:50:06 +08:00
    @zxlzy 谢谢,所以阻塞在更底层就是上下文切换么?
    zxlzy
        3
    zxlzy  
       2020-04-10 22:31:14 +08:00 via Android   ❤️ 1
    @Newyorkcity 不是的,上下文切换是线程的实现方式。
    阻塞是另一种实现方式。操作系统通过 PCB(process control block )来储存线程。 线程因为某个原因而阻塞的时候(比如你说的 join 其它线程),PCB 里的线程状态从 running 被修改为 blocking,此时调度器就不会再调度这个线程。 等导致线程阻塞的原因发生改变了以后,PCB 的线程状态就会修改为 ready,就有可能再次被调度。
    zxlzy
        4
    zxlzy  
       2020-04-10 22:33:32 +08:00 via Android   ❤️ 1
    cpu 上运行哪个线程由线程调度器(process scheduler)控制的,当调度器不再调度某个线程的时候,这个线程也就不再会运行了。也就是被阻塞了。
    而调度器是只会调度 ready 状态的线程的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1407 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 23:48 · PVG 07:48 · LAX 15:48 · JFK 18:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.