干货-并发编程提高——线程的中断(六)

执行IO命令的线程不管是本地IO还是网络IO在JVM中线程其状态都是Runable。相对于操作系统,OS会将当前线程挂起,然后由调度队列另起一个线程来执行。此时硬盘正在与CPU并发工作。当IO完成时,CPU会收到来自硬盘的中断信号。类似于回调的操作,告诉你,已经处理完了,等着收尸吧。

此时之前由操作系统阻塞的线程被唤醒。此时这些状态都是在OS上的,想较于JVM此时的状态仍是Runable。就好比前台或保安坐在他们的位置上,可能没有接待什么人,但你能说他们没在工作吗?

因join()方法而等待的线程是如何唤醒的呢?当一个线程执行完任务时也就是生命周期最后的时光,jvm在关闭线程前会检测阻塞在目标线程对象上的对象。然后执行notifyAll()全部唤醒。

wait() & notifyAll() 方法为什么要放入到同步块儿中呢? 诙谐的说下:首先wait()方法 & notify()方法不放在同步块儿里。编译就会报错,IDE也会提示。

其次重要的是,Lost-wake-up 问题。只要是多线程环境,就会出现

如此,那么线程就无法被唤醒了。需要一种同步的机制,把检查设置状态变成原子操作。且wait()¬ify()操作不交叉执行。也就是需要共同对同一对象进行加锁与释放锁以保持独立。

 

  1. 单核CPU实现所谓的“并发”的基本原理,但其实是快速切换带来的假象。
  2. 关于线程Runable:通常,Java的线程状态是服务于监控的,如果线程切换得是如此之快,那么区分 ready 与 running 就没什么太大意义了。
  3. 当你看到监控上显示是 running 时,对应的线程可能早就被切换下去了,甚至又再次地切换了上来,也许你只能看到 ready 与 running 两个状态在快速地闪烁。当然,对于精确的性能评估而言,获得准确的 running 时间是有必要的。
  4. 现今主流的 JVM 实现都把 Java 线程一一映射到操作系统底层的线程上,把调度委托给了操作系统,我们在虚拟机层面看到的状态实质是对底层状态的映射及包装。JVM 本身没有做什么实质的调度,把底层的 ready 及 running 状态映射上来也没多大意义,因此,统一成为runnable 状态是不错的选择。
  5. 没有参数的wait()方法等价于wait(0),等价于永远等下去

 

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值