02. 就该这么学并发 - 线程的就绪与执行

C++多线程并发(一)--- 线程创建与管理 一、何为并发 简单来说,并发指的是两个或多个独立的活动在同一时段内交替发生。与并发相近的另一个概念是并行,并行则强调的是多个独立的活动在同一时刻点同时发生。 二、为什么使用并发 在应用程序中使用并发的原因主要有两个:关注点分离和性能。事实上,甚至可以说它们差不多是使用并发的唯一原因;当你观察的足够仔细时,一切其他因素都可以归结到这两者之一(或者可能是二者兼有)。 阅读详情

前言

接上章“线程的创建”, 本章我们聊聊线程生命周期的“就绪”和“运行”状态.

就绪(Runnable)

线程对象的start()方法被调用后,该线程即进入就绪状态

- 此时JVM会为其创建方法调用栈和程序计数器;

- 该状态的线程一直处于"线程就绪队列"
  尽管是采用队列形式,事实上,把它称为可运行池而不是可运行队列,
  因为CPU的调度不一定是按照先进先出的顺序来调度的

- 此时线程等待系统为其分配CPU时间片,并不是说执行了start()方法就立即执行

简而言之,

假设有子线程t, 那么“t.start()”,

并不是我们以为的“子线程t立刻就执行了”,

而是“告诉CPU: 子线程t在等待执行了,随时等你的调度”

可以让子线程调用“start()”后立刻执行么?

这里其实要分情况讨论

  • 只有主线程, 和一个就绪的子线程
程序可以使用Thread.sleep(1) 来让当前运行的线程(主线程)睡眠1毫秒,
1毫秒就够了,因为在这1毫秒内CPU不会空闲,它会去执行另一个处于就绪状态的线程,
这样就可以让子线程立即开始执行;
  • 有多个就绪的线程
那么情况就复杂的多, 我们可能需要使用“sleep()”,“wait()”,“yield() ”,“setPriority() ”等来干预,
确保同一时刻只有一个就绪的子线程.

对于线程的控制, 大家一定要记得一句话

我们并不能精确的控制线程执行, 只能粗略的干预

运行(Running)

当就绪的线程获得CPU的时间片,线程就进入运行状态并自动调用自己的run()方法

run()方法定义了线程的操作和功能

- 如果计算机只有一个CPU,那么在任何时刻只有一个线程处于运行状态;

- 如果在一个多处理器的机器上,将会有多个线程并行执行,处于运行状态;

- 当线程数大于处理器数时,依然会存在多个线程在同一个CPU并发执行现象(轮换执行);

并发并行

很多人可能对并发并行的概念有疑惑,这里就简单的介绍下

并发

一个处理器同时处理多个任务(某一时刻只有一个任务在处理)

并行

多个处理器(或者多核的处理器)同时处理多个不同的任务(某一时刻多个任务在处理)

前者是**逻辑上的同时发生**

而后者是**物理上的同时发生**

来个比喻:

并发就是一个人同时吃三个馒头

并行就是和三个人同时吃三个馒头

并发解决的是线程阻塞造成的不流畅问题

并行才是真正解决运行效率的问题

t.start()和t.run()区别

学完此章, 可能又同学看到线程的“start()”和“run()”方法,又疑惑了, 这两个字面意思好像都是“开始执行”, 有啥区别?

我们创建一个线程

ExtendsThread t  = new ExtendsThread();

其实,t.start()方法执行后,本质上也是调用run()函数体方法,

我们举个例子

t.start()

public class ImpRunnableThread implements Runnable {
    @Override
    public void run() {
        System.out.println("运行---->" + Thread.currentThread().getName() + "<-----");
    }
}
class Test {
    public void main(String[] args){
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + "创建了一个:线程" + i);
            ImpRunnableThread r = new ImpRunnableThread();
            Thread t = new Thread(r,"线程" + i);
            t.start(); //t.run();
        }
    }
}

运行

main创建了一个:线程0
main创建了一个:线程1
运行---->线程0<-----
main创建了一个:线程2
运行---->线程1<-----
main创建了一个:线程3
运行---->线程2<-----
main创建了一个:线程4
运行---->线程3<-----
运行---->线程4<-----

t.run()

main创建了一个:线程0
运行---->main<-----
main创建了一个:线程1
运行---->main<-----
main创建了一个:线程2
运行---->main<-----
main创建了一个:线程3
运行---->main<-----
main创建了一个:线程4
运行---->main<-----

对比两种结果,我们可以发现输出的异同

因此得出结论

  • t.start()和t.run()都运行了run()内的代码

  • t.start()是真的启动了相应的线程0-4,而t.run()并没有真的启动线程0-9,而是由一个叫**main的主线程去调用的run()内的代码**.

  • t.start()方法具有异步执行的效果,而使用t.run()方法是同步执行的效果

有时候t.start()运行结果上看起来也是同步的,
多运行几次,或者增加线程数就能看出区别,
原因就在于: 
t.start()是真正让子线程在执行,
而子线程何时运行是由JVM调度的,所以执行是无序的;
而t.run()则直接在单线程main上执行,所以是有序的!

所以,我们一定要使用start()方式来运行线程!!

main线程是什么?

搞懂了t.start()和t.run()的区别,

可能有朋友会对刚刚的demo输出有疑惑了?

main创建了一个:线程0
运行---->main<-----
main创建了一个:线程1

这个 main是个什么???

这个时候我们就得联想到进程的概念了,前面有说过,

进程必须至少有一个线程

如何保证这个“至少一个”呢?

显然,JVM启动时则自动帮我们创建了这个线程,名字就叫“main”

这一块的内容后续学习JVM时我们再进一步探究

main线程和其它线程几乎没有什么不同

唯一的不同就是

main线程是个非守护线程,不能通过线程对象的setDaemon(true)设置成守护线程

守护线程就是个无限循环的线程,用来执行一些监控,定时触发的任务

和其他线程一样,main线程的死亡,也不会对其它线程产生任何影响

请关注我的订阅号

订阅号.png

Java多线程与高并发 阅读详情

相关推荐

进程和线程的创建(linux) 源代码

1. 在linux下编写一个应用程序,命名为an_ch2_1b。这个程序不断地输出如下行: Those output come from child,[系统时间] 另外写一个应用程序,命名为an_ch2_1a。这个程序创建一个子进程,执行an_ch2_1b。这个程序不断地输出如下行: Those output come from child,[系统时间] 观察程序运行的结果,并对你看到的现象进行解释。 2。在linux环境下编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对shared_var 进行减1 操作,即每次循环shared_var 被减1。观察程序运行的结果,并对你看到的现象进行解释。

线程五种状态(新建、就绪、运行、阻塞、死亡)

线程的5种状态:  每个 Java 程序都有一个缺省的主线程,对于 Java 应用程序,主线程是 main()方法执行的线索; 对于 Applet 程序,主线程是指挥浏览器加载并执行 Java Applet 程序的线索。要想实现多线程, 必须在主线程中创建新的线程对象。任何线程一般具有五种状态,即创建、就绪、运行、阻塞、终止。 1、新生状态        在程序中用构造方法(new操...

坚持 3万+

第十九届全国大学生智能车竞赛越野信标 硬件篇

全国大学生智能汽车竞赛,越野信标组

2301_77568650的博客 4115

线程的五大状态

线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。 (http://www.blogjava.net/images/blogjava_net/santicom/360%E6%88%AA%E5%9B%BE20110901211600850.jpg ...

chuanleimeng7826的博客 1430

Windows系统下搭建MPI(并行计算)环境

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;W

weixin_43417960的博客 5752

ubuntu 20.04系统离线安装nfs

ubuntu环境下,离线安装nfs

m0_62464865的博客 2240

(50)多线程 - 就绪状态&运行状态

/** * <就绪状态 * 1.调用start()方法进入就绪状态 * 2.当运行过程中遇到了阻塞,阻塞解除后进入就绪状态,比如join()运行结束 * 3.yield CPU的调度,进入就绪状态 * 4.jvm 切换线程(看不到) * * <运行状态 * 1.无法控制,由CPU同一调度 * 2.就绪状态与运行状态同一称为Runnable * 3.遇到sleep(...

Ricardo__Lu的博客 860

阿里云网络架构设计

背景 一个企业上云,首先要考虑整个网络的规划,涉及到云上和云下的网络规划,云上VPC的规划,云上不同地域VPC的互通,云上可用区的选择等等,所以一定要提前规划好整体的网络架构,现在阿里云云上的虚拟化网络解决方案已经完全转向 了云企业网,所以所有使用阿里云的企业客户多多少少都会使用阿里云的CEN 支撑自己的业务。 云企业网介绍 云企业网(Cloud Enterprise Network)是承载在阿里云提供的高性能、低延迟的私有全球网络上的一张高可用网络。 IDC专线接入CEN 首先面临的是云上和云下打通,那么

修电脑的码农 4837

线程的5种状态详解

Java中的线程的生命周期大体可分为5种状态。 1.新建(NEW):新创建了一个线程对象。 2.可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。 3.运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslic...

老猫的博客 24万+

Midscene.js(3):手把手教你用 YAML 脚本实现 AI 驱动的 Web UI 自动化「喂饭教程」

Midscene.js是一款开源的AI驱动UI自动化工具,通过自然语言描述即可控制浏览器或Android设备执行操作。它支持YAML脚本编写测试用例,降低了自动化测试门槛。

blues_C的博客 3239

mojoPortal 路径穿越漏洞复现(CVE-2025-28367)(附脚本)

 在 mojoPortal CMS 版本 <=2.9.0.1 中发现了一个导致 ViewState 反序列化的目录遍历漏洞。通过利用此问题,未经身份验证的攻击者可以泄露 Web 根目录中的敏感文件,包括应用程序的文件。此配置文件包含用于验证和解密 ViewState 数据的文件。知道此密钥后,网络攻击者可以构建恶意 ViewState 有效负载,从而导致在底层服务器上执行远程代码。(CVE-2025-28367)

iSee857的博客 500

多线程(并发执行)

一、概念区分 1、并行与并发 并行 ​ 当系统有一个以上CPU时,同一时刻,当一个CPU在执行一个任务时,另一个CPU在执行另一个任务,两个任务互不抢占CPU资源,可以同时进行(多核CPU,一个CPU执行一个进程) 并发 ​ 一个CPU,同一时间,有多个任务在执行。但并发不是真正意义上的“同时进行”,只是将CPU划分成好几个时间片段,每个片段内执行一个任务,然后在这几个片段之间来回切换,由于CPU处理速度快,让用户感觉像是多个任务在同时执行。 区别: 并行是某一时刻,真正有多个程序在运行;并发是在一段时

weixin_42556307的博客 1万+

Allan方差这个工具,怎么把它用的更顺手?(附Allan方差、动态Allan方差代码)

本文详细说明了Allan方差和动态Allan方差的计算过程,并通过递归运算和时间序列选择两种算法提高动态Allan方差的计算效率。文末提供了快速动态Allan方差计算代码。

victoryqian528的博客 372

一文搞懂程序、进程、线程、并发、并行、高并发的概念

程序、进程、线程、并发、并行和高并发是计算机科学领域中非常重要的概念。了解进程、线程、并发和并行的概念,可以更好地利用计算机的多核处理器和并行计算能力,提高计算机性能。了解进程和线程为操作系统中的资源管理提供了基础,包括CPU时间、内存空间等。有效地管理进程和线程可以提高系统的资源利用率。进程和线程对于实现多任务处理至关重要。它们使得操作系统可以同时运行多个独立的任务。并发是现代软件开发中一个重要的概念,允许程序中的多个任务同时执行,这对于提高系统的吞吐量和响应时间至关重要。

Lion_Long的博客 6337

SAP UI5 本地开发工具 fiori-tools-proxy 中间件详解及使用场景

该中间件基于 http-proxy-middleware 库实现,分为 ui5 资源代理和 backend 代理两大模式,并可与 fiori run 或 ui5 serve 命令无缝集成,通过配置 ui5.path、ui5.url 以及 backend.path、backend.url 等参数,实现与目标系统的灵活对接和安全配置 (就后端系统代理而言,fiori-tools-proxy 内置 @sap-ux/backend-proxy-middleware,可将以指定前缀(如。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 516

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

进程与线程 并发与并行

一:进程与线程 1.先来一张图,直观了解一下进程与线程的关系 总结:进程是系统分配资源的最小单位,线程是系统调度的最小单位。一个进程内的线程之间是可以共享资源的。每个进程至少有一个线程存在,即主线程 二:进程的状态 就绪:进程处于可运行的状态,只是CPU时间片还没有轮转到该进程,则该进程处于就绪状态。 运行:进程处于可运行的状态,且CPU时间片轮转到该进程,该进程正在执行代码,则该进程处于运行...

zhanghongkai0916的博客 1361

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

线程的新建和就绪状态

一点睛 当线程被创建启动以后,它既不是一启动就进入执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建、就绪、运行、阻塞和死亡5种状态。当线程启动后,它不可能一直霸占CPU独自运行,所以CPU需要在多个线程之间切换,于是线程状态也会多次在运行和就绪之间切换。 当程序使用new关键字创建一个线程后,该线程就处于新建状态。 当线程对象调用start()方法之后,该线程就处于就绪状...

实践求真知 1415

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

线程的魔法:揭开现代操作系统并发执行的面纱

线程现代操作系统中,进程作为资源拥有者,而调度和运行的属性赋予新的实体——是进程中实施调度和分派的基本单位。线程引入每个进程有自己的地址空间,保存进程映像,控制一些资源(文件,I/O设备),有状态、优先级、调度调度单位进程是一个执行轨迹创建进程撤消进程进程切换线程必须在某个进程内执行。

Srlua的博客 1193

进程&线程&并发

什么是线程 一个线程是进程的一个顺序执行流。同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行时的堆栈。线程在切换时负荷小,因此,线程也被称为轻负荷进程。一个进程中可以包含多个线程。 进程与线程的区别 一个进程至少有一个线程。线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程的区别在于每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必

喜欢前端的后端 MelodyJerry 603

线程与进程、并发与并行——概念篇

本文章主要讲述线程、进程、并发和并行的基本概念以及常用例子,接着会阐述它们之间的关系以及应用场景。主要有以下内容:进程(概念、组成、特征、状态)、线程(概念、特征、创建)、进程与线程的关系、并发(概念、特征、实现方式)、并行(概念、特性、实现方式)、并发与并行的关系。

2403_86425112的博客 1110

高并发与多线程的关系与区别

一、什么是高并发        高并发(High Concurrency)是一种系统运行过程中遇到的一种“短时间内遇到大量操作请求”的情况,主要发生在web系统集中大量访问收到大量请求(例如:12306的抢票情况;天猫双十一活动)。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求、数据库的操作等。 二、高并发的处理指标 高并发相关常用的一些指标有:响应时...

weixin_48358336的博客 3104

Java线程执行顺序控制:同时、依次与交错执行实现

本文介绍了Java中线程执行顺序控制的两种核心场景及实现方案:1)线程同时执行,通过CountDownLatch实现多线程同步启动,适用于分布式系统健康检查等需要统一触发时间的场景;2)线程依次执行,采用Thread.join()或等待唤醒机制确保顺序性,适用于订单处理等存在前后依赖的业务流程。文章包含完整代码示例和原理说明,帮助开发者掌握并发编程中的线程调度技术。

没事学AI的博客 856

多线程底层执行原理

说道底层运行,那么是不是就是需要依靠CPU啊; 那,各位之前有没有听过一句话叫做,一个CPU在同一个时间片只能执行一个程序; 什么意思呢? 就是,你的程序是不是都运行在一个CPU上啊,那你真正一个CPU在同一个时间片里是不是只能执行一个程序呀,那这个程序究竟要执行那个程序,是不是就需要通过线程之间时间片的一个争抢; 时间片:微小的时间段; 多线程说白了就是时间片的争夺,那个线程获取了时间...

jusu10的博客 2119

java线程就绪方法_Java多线程详解之二:线程5种状态及方法

一、线程状态线程一共拥有以下五种状态:1.创建状态:通过继承Thread类或者实现Runnable接口的方法新建一个线程类,然后new一个该线程类的对象;2.就绪状态:线程类对象执行start()方法,可以使线程进入就绪队列,等待cpu资源(cpu时间片);当处于就绪状态的线程获得cpu资源时,会进入运行状态,即执行该线程;当处于运行状态的线程时间片用完后,会退回到就绪状态,等待cpu资源;当处于...

weixin_34727107的博客 1973

并发与多线程

基本概念 并发:在某个时间段内,多任务交替处理的能力。 并行:同时处理多任务的能力。 并发与并行的目标:尽肯能快的执行完所有任务。 并发特点: 并发程序之间有相互制约的关系。 (1)直接制约:一个程序需要另一个程序的结果。 (2)间接制约:程序间竞争共享资源。 并发程序的执行过程是断断续续的 并发数设置合理并且CPU拥有足够处理能力是,并发会提高程序的效率 (1)在极端情况下,比如单核CPU,在单核的条件下,并发一般比串行效率要低,只要消耗在上下文切换–记忆现场和恢复现场等。 (2)防止阻塞:单核CPU下

m0_46269902的博客 1331
上一篇: 暗藏杀机? 不简单的三目运算符号!
下一篇: 40. 从零开始学springboot-再谈参数合法性验证
码哥说
博客等级 码龄8年 5645粉丝 172原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值