Java 一点小问题

2016-07-25 14:07:17 +08:00
 final0pro

有点晕。

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 吗?

不甚感谢!

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

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

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

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

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

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

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

这个有没有具体的书籍讲解的呀。看源码么:(
sorra
2016-07-26 11:32:54 +08:00
@final0pro
1. 可以这么说,而且有系统调用的开销
2. sleep 不是自旋
《 Java 并发编程实战》第 2 章和第 11.3.3 节
final0pro
2016-07-27 05:31:18 +08:00
@sorra 好的。正好买了那本书。
sorra
2017-01-21 10:54:59 +08:00
@final0pro 因为有个用户在发 PHP 的博客,而且不是原创,有些噪音。开通了 RSS 单独订阅某位用户的功能,在用户主页的右上角。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/294756

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX