V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
final0pro
V2EX  ›  Java

Java 一点小问题

  •  
  •   final0pro · 2016-07-25 14:07:17 +08:00 · 3021 次点击
    这是一个创建于 2830 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有点晕。

    Java Thread 有 NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED 六个状态。

    比如一个 blocking method ,在这个等待的过程中,这个 thread 到底是什么状态?到底消耗不消耗 CPU , CPU 会被 schedule 到去执行这个线程吗?

    举具体的例子,

    1. Future.get() 等待的过程
    2. jdbc 存数据
    3. Thread.sleep()
    4. http 异步请求?这个我不明白它的原理,销毁当前线程,把这个请求放到一个队列交给一个线程池?那那个真正的『工作线程』在等待请求返回的过程中?具体是什么状态?消耗 CPU 吗?

    不甚感谢!

    10 条回复    2017-01-21 10:54:59 +08:00
    sorra
        1
    sorra  
       2016-07-25 14:36:06 +08:00   ❤️ 1
    切到等待状态后(通常是 IO)几乎不消耗 CPU 。用于 IO(包括 HTTP)的工作线程属于此类。
    另一种情况是等一个锁,会进行自旋,不切到等待状态,略为消耗 CPU 。

    但线程多了会消耗内存,还削弱了空间局部性,仍是一种负担。
    sorra
        2
    sorra  
       2016-07-25 14:39:20 +08:00
    我计划在 www.qingjingjie.com 发表一篇并发编程的文章,但仍未完成。
    final0pro
        3
    final0pro  
    OP
       2016-07-25 14:48:32 +08:00
    @sorra 谢谢!

    对,多线程耗内存,切换消耗大。

    请问,自旋是一个 while loop 吗?

    还有对于 IO 等待,是等东西好了, IO 会去中中断之前等待的线程,让其恢复到可以继续执行的状态?
    final0pro
        4
    final0pro  
    OP
       2016-07-25 14:49:29 +08:00
    @sorra 没有 rss !
    sorra
        5
    sorra  
       2016-07-25 15:22:56 +08:00
    @final0pro 单纯的自旋是一个 loop ,但一般的实现在 loop 几次后会考虑改变策略。 Java 的 synchronized 就是先自旋几次,不成功就退化为等待。

    IO 等待如你所想,之前等待的线程会被通知继续执行。

    rss 我尽快写一个
    sorra
        6
    sorra  
       2016-07-25 16:51:29 +08:00
    @final0pro 有 RSS 了
    final0pro
        7
    final0pro  
    OP
       2016-07-25 23:09:06 +08:00
    @sorra 自旋是为了避免 context switch 的消耗吗? Thread.sleep() 是不是也是自旋。

    这个有没有具体的书籍讲解的呀。看源码么:(
    sorra
        8
    sorra  
       2016-07-26 11:32:54 +08:00
    @final0pro
    1. 可以这么说,而且有系统调用的开销
    2. sleep 不是自旋
    《 Java 并发编程实战》第 2 章和第 11.3.3 节
    final0pro
        9
    final0pro  
    OP
       2016-07-27 05:31:18 +08:00
    @sorra 好的。正好买了那本书。
    sorra
        10
    sorra  
       2017-01-21 10:54:59 +08:00
    @final0pro 因为有个用户在发 PHP 的博客,而且不是原创,有些噪音。开通了 RSS 单独订阅某位用户的功能,在用户主页的右上角。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3502 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 10:58 · PVG 18:58 · LAX 03:58 · JFK 06:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.