并发编程---线程与进程

业务场景:小明去理发店理发。

小明去理发店理发,完成理发需要吹,剪,洗、理的过程。由这个场景我们引用进程和线程这两个

概念。

一.进程

1.什么是进程

进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。进程是可与其他程序并发执行的程序,在一个数据集合上的运行过程。它是系统进行资源分配和调度的一个独立单位。

大家打开windows的任务管理器就可以看到,系统运行的进程。

2.进程的几个概念

2.1 结构性

为了控制和管理进程,系统为每个进程设立一个**进程控制块\- PCB。

每个进程拥有一个控制块(PCB),这是进程存在的依据,用于描述和记录进程的动态变化过程,并使之能正确运行。

2.2 动态性

进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的,进程在其生命周期内,在三种基本状态(产生、执行、消亡)之间转换。

进程是程序在处理机上的一次动态执行过程。它因创建而产生,由调度而执行,因得不到资源而暂停执行,最后因撤销而消亡。

2.3 异步性

由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。

系统中的各进程以独立的、不可预知的速度向前推进。

2.4 并发性

任何进程都可以同其他进程一起向前推进。

多个进程实体可以同时存在于内存中,在一段时间内都得到运行,它们在执行时间上是重叠的。

2.5 独立性

进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。

进程是能独立运行的基本单位,也是系统进行资源分配和调度的独立单位。

二.线程

我们把理发这个进程分解为几个子任务(线程)如下:

1.线程的定义

 1.1 线程是程序执行的**最小单位\,而进程是操作系统分配资源的最小单位;

 1.2 一个进程由一个或多个线程组成,线程是一个进程中代码的**不同执行路线\;

 1.3 进程之间相互独立,但同一进程下的**各个线程之间共享程序的内存空间(包括代码段,数据     集,堆等)及一些进程级的资源(如打开文件和信号等),某进程内的线程在其他进程不可见;

 1.4 调度和切换:线程上下文切换比进程**上下文切换要快得多\;

2.线程和进程的区别

3.线程的切换方式

三.线程的生命周期

1.线程创建

1.1 继承Thread类

public class ThreadDemo extends Thread{public ThreadDemo(String name){setName(name);}public void run(){for (int i = 1;i <= 100;i++){System.out.println(getName() + ":" + i);if (i==5) throw new RuntimeException("死亡");}}public static void main(String[] args) throws InterruptedException {Thread t1 = new ThreadDemo("A");Thread t2 = new ThreadDemo("B");t2.start();//readyt1.start();//ready
//        Thread.sleep(100);
//        System.out.println("main");}
}

1.2 实现Runnable接口

/*** 实现Runnable接口*/
public class ThreadDemo02 implements Runnable{private String name;public ThreadDemo02(String name) {this.name = name;}@Overridepublic void run() {for (int i = 0;i < 10;i++){System.out.println(this.name + "---" + i);}}public static void main(String[] args) {Thread t1 = new Thread(new ThreadDemo02("A"));Thread t2 = new Thread(new ThreadDemo02("B"));t2.start();t1.start();}
}

1.3 实现Callable接口

public class ThreadDemo01 implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 1; i < 1000; i++) {sum += i;}return sum;
}
public static void main(String[] args) throws Exception {FutureTask<Integer> ft =new FutureTask<Integer>(new ThreadDemo01());ft.run();System.*out\*.println("s:" + ft.get());}
}

2.线程就绪

Thread t = new Thread( );
t.start( ); //启动线程(线程就绪)

3.线程运行

一旦CPU分配了运行时间,就调用线程的run( )方法。

4.线程阻塞

线程阻塞可以分为以下几种类型:

1‌‌.等待阻塞‌:线程调用wait()方法,进入等待状态,等待其他线程的通知或者中断。
‌‌2.同步阻塞‌:线程在获取对象锁时,如果该锁被其他线程占用,则进入同步阻塞状态。
‌‌3.睡眠阻塞‌:线程调用sleep()方法,进入睡眠状态,等待一定时间后自动唤醒。
‌‌4.IO阻塞‌:线程在执行IO操作时,如果IO操作没有完成,则进入IO阻塞状态。
‌5.其他阻塞‌:线程调用join()方法等待其他线程执行完毕,或者调用yield()方法主动让出CPU资源。

5.线程死亡

线程死亡是线程生命周期的一个重要阶段。线程在完成其任务后自动进入死亡状态。当一个线程完成其执行,或因未捕获的异常而退出时,该线程将进入死亡状态,此时线程的所有资源将被释放。

线程死亡的条件:
1.正常结束:线程执行完run()方法。
2.异常结束:在线程执行过程中出现未处理的异常。
3.被强制终止:其他线程调用stop()等方法。

四.守护线程与用户线程

1.用户线程User Thread(创建的线程)

不需要内核支持而在用户程序中实现的线程

用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。

2.守护线程Daemon Thread(守护最后一个用户线程才结束)

守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

import java.text.SimpleDateFormat;
import java.util.Date;/*** 守护线程*/
public class ShouHuDemo {public static void main(String[] args) throws Exception{Thread t1 = new Thread(() -> {while (true){try {Date now = new Date();long s1 = now.getTime();SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd hh:mm:ss");Date parse = sdf.parse("24-09-15 17:15:00");System.out.println(sdf.format(now));long s2 = parse.getTime();System.out.println("s1:" + s1 + "s2:" + s2);if (s1 == s2){System.out.println("到点了!!!");}Thread.sleep(1000);} catch (Exception e) {throw new RuntimeException(e);}}});Thread t2 = new Thread(() -> {for (int i = 0;i < 100;i++){try {System.out.println("o" + i);Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t1.setDaemon(true);t1.start();t2.start();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1548394.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

js删除emoji表情问题

emoji标签占位两个 &#xff0c;直接删除后一位会出现乱码符&#xff1b; 判断是否是emoji function isEmoji(char) {let code char.charCodeAt(0);return code>55296&&code<57343 } // 使用方法&#xff0c;传入单字符 console.log(isEmoji(1)); // false con…

算法复杂度之时间复杂度

一 . 数据结构前言 1.1 数据结构 数据结构(Data structure) 是计算机存储&#xff0c;组织数据的方式&#xff0c;指互相之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用&#xff0c;所以要学习各式各样的数据结构&#xff0c;如&#…

pilz皮尔兹PSSuniversal分散控制平台 Dezentrale Steuerungsplattform 手测

pilz皮尔兹PSSuniversal分散控制平台 Dezentrale Steuerungsplattform 手测

【科研小小白】理解图片容量、像素、尺寸、分辨率各自含义、 像素、分辨率与实际尺寸之间的转换关系

理解图片容量、像素、尺寸、分辨率各自含义&#xff1a; 通过之前的学习&#xff0c;我们知道了图片有这4个参数&#xff0c;下面给大家总结一这下4个参数的具体含义。 1、容量&#xff08;占内存&#xff09;&#xff1a;是指图像文件的存贮空间&#xff0c;也就是文件的大小…

华为OD机试 - 获取最多食物 - 拓扑排序、动态规划(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

计算机毕业设计 基于Python的广东旅游数据分析系统的设计与实现 Python+Django+Vue Python爬虫 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

职场基本功:情绪管理的行动指南(前置情绪管理)

文章目录 引言情绪管理的目标情绪产生的阶段前置情绪管理避免情绪失控的技巧案例分析引言 成熟的职场人,必备的五项技能: 管理自己的情绪:职场需要你的行为是可控的,只有情绪是稳定的,其他人才能顺利地跟你展开协作。称赞他人:赞赏能让你获得一个友好的交流环境求助他人…

为什么这款智能在线派单软件成为行业首选?

智能在线派单软件通过自动化任务分配等提升效率&#xff0c;ZohoDesk因其全方位服务管理、智能分配、定制性强、数据分析等功能&#xff0c;成为企业优选。实例涵盖物流、家政、维修、医疗等行业&#xff0c;提高效率和客户满意度。 一、智能在线派单软件有什么功能 在深入探讨…

GPT理论

1.GPT发展 Transformer是一个用作翻译任务的模型&#xff0c;谷歌出品。 GPT全称 lmproving Language Understanding by Generative Pre-Training&#xff0c;用预训练语言理解模型。OPENAI出品。 BERT全称Pre-training of Deep BidirectionalTransformers for Language Unde…

C++入门day5-面向对象编程(终)

C入门day4-面向对象编程&#xff08;下&#xff09;-CSDN博客 本节是我们面向对象内容的最终篇章&#xff0c;不是说我们的C就学到这里。如果有一些面向对象的基础知识没有讲到&#xff0c;后面会发布在知识点补充专栏&#xff0c;全都是干货满满的。 https://blog.csdn.net/u…

阿博图书馆管理:SpringBoot实战指南

第二章 开发技术介绍此次B/S结构、Java技术以及mysql数据库是该阿博图书馆管理系统的主要开发技术&#xff0c;然后对系统的整体设计、数据库设计、功能模块设计、系统页面设计以及系统程序设计进行了详细的研究与规划。 2.1 系统开发平台 在该阿博图书馆管理系统中&#xff0c…

OJ在线评测系统 代码沙箱优化模版方法模式 使用与有规范的流程 并且执行流程可以复用

代码沙箱优化模版方法模式 上次我们代码沙箱的docker实现和原生实现 我们可以使用模版方法设计模式去优化我们的代码 我们原生的java实现代码沙箱和docker实现代码沙箱是有更多重复点的 比如说把文件 收集文件 进行校验 我们要用模版方法设计模式 定义一套通用的执行流程 让…

2024年合肥市职业院校技能大赛(中职组)赛 网络安全理论题

竞赛内容 模块A: 理论技能与职业素养 培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;624032112 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 极安云科专注于技能提升&#xff0c;赋能 2024年广东省高校的技…

cubemx配置ADC

参考博客&#xff1a;https://blog.csdn.net/qq_29031103/article/details/119894077 生成代码&#xff1b; 接着编写代码&#xff1a; 1&#xff09;在main函数bsp初始化部分&#xff1b; 添加&#xff1a;HAL_ADCEx_Calibration_Start(&hadc1); 2&#xff09;在…

C++之STL—常用拷贝和替换算法

copy(iterator beg, iterator end, iterator dest); // 按值查找元素&#xff0c;找到返回指定位置迭代器&#xff0c;找不到返回结束迭代器位置 // beg 开始迭代器 // end 结束迭代器 // dest 目标起始迭代器 replace(iterator beg, iterator end, oldvalue, newvalue); …

Techub专访顾荣辉教授:解密CertiK的安全战略路线

当 Web3 安全审计公司还在争抢审计份额时&#xff0c;CertiK 已经开始将目光瞄准即将进军 Web3 的传统商业巨头。CertiK 不仅在传统行业进行白帽行动获得如苹果公司的官方感谢&#xff0c;还是 Web3 行业唯一一家拥有 SOC 2 和 ISO 认证的 Web3 的安全公司。基于此&#xff0c;…

Redis篇(数据类型)

目录 讲解一&#xff1a;简介 讲解二&#xff1a;常用 一、String类型 1. 简介 2. 常见命令 3. Key结构 4. 操作String 5. 实例 二、Hash类型 1. 简介 2. 常见命令 3. 3操作hash 4. 实例 三、List类型 1. 简介 2. 特征 3. 应用场景 4. 常见命令 5. 操作list …

AT89C51 利用SBIT寻址,并且在内存中实现伪动态密码的混淆

前置发现 && 分析 char bdata DB[2]; //char sbit x bdata DB[0]^7; //取内存地址数组[0]地址的的七位 这样我们可以对数组DB中索引0的位置进行修改… 例如,将密码A映射到真实密码C,这样做的好处是你的程序被逆向分析的时候,攻击者无法真正知道密码到底是什么…因为…

程序员必备秘籍:掌握代码规范,让开发效率飞速提升!

在软件开发的世界里&#xff0c;代码规范如同指南针&#xff0c;为开发团队和测试团队指明方向。一个统一的代码规范不仅能够提升代码的可读性和可维护性&#xff0c;还能显著提高开发效率和团队协作能力。 本文将带你深入了解代码规范的重要性&#xff0c;并揭示如何通过它来实…

Angular与Vue的全方位对比分析

一、框架概述 Angular Angular是由Google开发和维护的一款开源JavaScript框架。它采用TypeScript编写&#xff0c;具有一套完整的开发工具和规范。Angular遵循MVC&#xff08;Model - View - Controller&#xff09;或更确切地说是MVVM&#xff08;Model - View - ViewModel&a…