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

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

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

概念。

一.进程

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.rhkb.cn/news/433633.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Hadoop的NBA球员大数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

MySQL InnoDB MVCC数据结构分析

1、概述 MVCC&#xff08;Multiversion Concurrency Control&#xff09;多版本并发控制&#xff0c;通过维护不同的版本号&#xff0c;提供一种很好的并发控制技术&#xff0c;这种技术能够使读写操作不冲突&#xff0c;提升并发性能。 MySQL InnoDB存储引擎&#xff0c;在更…

Colorful/七彩虹将星X17 XS 22 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能&#xff0c;自动重建COLORFUL RECOVERY功能&#xff0c;恢复到新机开箱状态。 【格式】&#xff1a;iso 【系统类型】&#xff1a;Windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 注意&#xff1a;安装系统会…

设计模式、系统设计 record part02

软件设计模式&#xff1a; 1.应对重复发生的问题 2.解决方案 3.可以反复使用 1.本质是面向对象 2.优点很多 1.创建型-创建和使用分离 2.结构型-组合 3.行为型-协作 571123种模式 UML-统一建模语言-Unified Modeling Language 1.可视化&#xff0c;图形化 2.各种图&#xff08;9…

服务器操作系统【sar 命令】

sar 安装、语法参数说明以及示例 文章目录 功能概述一、功能介绍1.安装配置2. 配置3. 启动二、sar 语法及参数说明三、示例及释义1.汇报 io 传输速率信息2.内存分页信息3.块设备状态信息4.hugepages 利用率统计信息5.列长度和负载平均值6.内存利用率统计信息7.swap 交换空间利用…

ARM点灯---看手册

知识点&#xff1a; 一个程序可能会遇到内存泄漏问题&#xff0c;可能一次运行泄漏几M大小&#xff0c;执行几个小时才会泄漏到站崩溃&#xff0c;所以要查看是否有内存泄漏。 查看手册教程 0927-上午 视频1&#xff1a;25&#xff1b;00 硬件程序开发流程 最小系统:单片…

16.第二阶段x86游戏实战2-发包函数和怎么去找改写过的发包函数

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

使用celery+Redis+flask-mail发送邮箱验证码

Celery是一个分布式任务队列&#xff0c;它可以让你异步处理任务&#xff0c;例如发送邮件、图片处理、数据分析等。 在项目中和celery 有关系的文件如下&#xff1a; task.py : 创建celery.py 对象&#xff0c;并且添加任务&#xff0c;和app绑定&#xff0c;注意&#xff1…

实习前学一学git

工作区 暂存区 本地仓库 远程仓库 git commit -m "提交信息" 提交的是暂存区里的内容&#xff0c;没有git add 的不会被提交到本地仓库

对抗攻击方法详解:梯度攻击、转移攻击与模型集成攻击

对抗攻击方法详解&#xff1a;梯度攻击、转移攻击与模型集成攻击 近年来&#xff0c;随着深度学习模型在各个领域取得惊人突破&#xff0c;对抗攻击&#xff08;Adversarial Attack&#xff09; 逐渐成为研究热点。对抗攻击旨在通过在输入数据上施加精心设计的微小扰动&#x…

这样做快速除甲醛入住新家 科学分解甲醛的产品哪个好

这样做快速除甲醛入住新家 科学分解甲醛的产品哪个好 在新房装修的喜悦之余&#xff0c;业主们不得不面对一个常见却又棘手的问题——甲醛污染。甲醛&#xff0c;这种无形的敌人&#xff0c;以其难以察觉的存在&#xff0c;对家人和孩子的健康造成潜在威胁。很多业主们在装修期…

ArcEngine C#二次开发图层处理:根据属性分割图层(Split)

需求&#xff1a;仅根据某一属性&#xff0c;分割图层&#xff0c;并以属性值命名图层名称保存。 众所周知&#xff0c;ArcGIS ArcToolbox中通过Split可以实现图形分割一个图层&#xff0c;以属性值命名图层&#xff0c;如下图所示。 本文仅仅依据属性值&#xff0c;将一个shp…

InfiniiVision 3000T X 系列示波器

InfiniiVision 3000T X 系列示波器 综述 3000T X 系列示波器外形更为小巧&#xff0c;并配有简明直观的触摸屏用户界面&#xff0c;为您带来高端测量技术。 凭借其出色的波形捕获率&#xff0c;您可以捕获在其他示波器上无法捕获的偶发毛刺和异常。 3000T X 系列示波器搭配了…

猫头虎带你解决:error Error: certificate has expired

&#x1f42f;猫头虎带你解决&#xff1a;error Error: certificate has expired &#x1f4a5; 今天有粉丝问猫哥&#xff1a;“&#x1f42f;猫头虎&#xff0c;我在 Node.js 项目中使用 Yarn 安装包时遇到了一个错误&#xff1a;Error: certificate has expired。你能帮忙解…

Android Studio 真机USB调试运行频繁掉线问题

一、遇到问题 Android Studio使用手机运行项目时&#xff0c;总是频繁掉线&#xff0c;连接很不稳定&#xff0c;动不动就消失&#xff0c;基本上无法使用 二、问题出现原因 1、硬件问题&#xff1a;数据线 换条数据线试试&#xff0c;如果可以&#xff0c;那就是数据线的…

TortoiseGit 下载和安装

下载 1&#xff0c;下载路径 Download – TortoiseGit – Windows Shell Interface to Git 2&#xff0c;选择windows64的&#xff0c; 3&#xff0c;下载完成后 安装 1&#xff0c;双击运行&#xff0c;点击next 2&#xff0c;点击next 3&#xff0c;点击next 4&#xff0…

后端回写前端日期格式化

问题 不进行格式化处理&#xff0c;就会导致传递的字符串很奇怪 解决方案 注解&#xff08;字段&#xff09; <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.2</…

【大数据】大数据运维方案浅析总结

1. 引言 在大数据时代&#xff0c;如何高效管理和维护大规模数据平台&#xff0c;成为许多企业面临的重要挑战。本文将对市面上一些流行的大数据运维管理方案进行全面分析&#xff0c;包括Cloudera的CDH和CDP、Hortonworks的HDP、Apache的Ambari、国产开源平台Datasophon&#…

cups-browsed远程代码执行漏洞安全风险通告

今日&#xff0c;亚信安全CERT监控到安全社区研究人员发布安全通告&#xff0c;披露了cups-browsed 远程代码执行漏洞(CVE-2024-47176)。由于cups-browsed 服务在处理网络打印任务时&#xff0c;会绑定到 UDP 端口 631 上的 INADDR_ANY 地址&#xff0c;从而信任来自任何来源的…

什么是原生IP?

代理IP的各个类型称呼有很多&#xff0c;且它们在网络使用和隐私保护方面扮演着不同的角色。今天将探讨什么是原生IP以及原生IP和住宅IP之间的区别&#xff0c;帮助大家更好地理解这两者的概念和实际应用&#xff0c;并选择适合自己的IP类型。 一、什么是原生IP&#xff1f; 原…