首页 > 编程语言 >干货-并发编程提高——线程的中断(六)

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

时间:2024-07-30 10:25:04浏览次数:15  
标签:状态 IO 编程 running 干货 线程 JVM wait

执行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),等价于永远等下去

 

标签:状态,IO,编程,running,干货,线程,JVM,wait
From: https://blog.csdn.net/weixin_39384775/article/details/140788319

相关文章

  • 【花雕学编程】Arduino FOC 之使用正逆运动学的二轴绘图机器人程序
    Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用ArduinoIDE(集成开发环境)来编写、......
  • 初识Java多线程
    Java中如何创建新线程?第一种方式:继承Thread类写一个子类继承Thread重写run方法创建该类的对象,代表一个线程调用start方法启动线程,该线程会执行run方法这种方式的优点在于编码方式简单,但是该类已经继承了Thread类,不能继承其他类。注意:启动线程时一定调用start方法,而非ru......
  • 只讲干货!!数据库的裤腰带!!今天拿下:MySQL中的约束!!
    MySQL中的约束约束概述        数据库约束是对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性主键约束(PrimaryKey)PK        主键约束是使用最频繁的约束。在设计数据表时,一般情况下,都会要求表中设置一个主键。        ......
  • C# 网络编程:.NET 开发者的核心技能
    原文:C#网络编程:.NET开发者的核心技能-小码编匠-博客园(cnblogs.com) 一、HTTP请求HTTP(HypertextTransferProtocol)是互联网上应用最为广泛的一种网络协议,主要用于从万维网服务器传输超文本到本地浏览器的传输协议。在C#中,处理HTTP请求有多种方式,从传统的System.Ne......
  • python三天速成记(看完你就会)day3 满满干货~
    续上文啦~EXCEL表的操作上一篇文章讲了怎么读取和操作txt和csv文档,但其实我们生活中还有一个常用的文本格式那就是excel文件,特别是在对大量数据进行处理的时候。excel文件的用处和广泛。其实在python中有很多库可以处理excel文件,但是本文主要介绍使用最实用最广泛的库pan......
  • 编程: 十进制数转化为二进制数
    (1)通过合理的判断,符合正常思路importjava.util.Scanner;publicclasstest4{publicstaticvoidmain(String[]args){/*从键盘输入某个十进制整数数,转换成对应的二进制整数并输出。*/Scannersc=newScanner(Sys......
  • JavaEE 初阶(11)——多线程9之“阻塞队列”
    目录一.什么是“阻塞队列”二.生产者消费者模型2.1概念2.2 组件 2.3实际应用2.4优点 a.实现“解耦合” b.流量控制——“削峰填谷”2.5代价a. 更多的机器b.通信时间延长三.阻塞队列的实现 3.1简述  3.2ArrayBlockingQueue的使用3.3实现MyA......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(2)
    女神的睿智voidsolve(){strings;cin>>s;inta=0,b=0;for(inti=0;i<s.size();++i){if(s[i]==s[0])a++;if(s[i]==s[4])b++;}if(s[0]==s[4])cout<<s[0]<<'\n'......
  • 线程参数传递 同一个结构体指针,并且要传递id(0-xx)的方法
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、代码示例?总结前言提示:这里可以添加本文要记录的大概内容:线程参数传递同一个结构体指针,并且要传递id(0-xx)的方法在创建线程时候可能会遇到不仅要传递全局唯一的结构体指针给线程,还......
  • JavaSE基础编程十题
    写在前面昨天说了一下Java中的数据类型、运算符、选择语句、循环语句部分的基础知识,今天写的编程题就是来检验这部分的成果,来看看你能写出来几题。答案也是仅供参考,如果有更好的解法欢迎在下面留言!题目展示1.输入自己的名字,年龄和性别,分别用不同的变量接收,并将输入的信息做输出......