JavaEE初阶---多线程编程(一.线程与进程)

目录

🤣一.线程与进程的概念与联系:

进程的基本概念:

线程的基本概念:

进程和线程的区别与联系:

🙃代码执行实列:

1.通过继承Thread父类来实现多线程

2.通过实现Runnable接口来实现多线程:

3.通过Lambda表达式来实现多线程:

😇Thread类的常见属性和构造方法:


🤣一.线程与进程的概念与联系:

一张漫画,生动阐明进程进程与线程的关系:

进程的基本概念:

  • 什么是进程?→

🧐🧐定义:进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行的程序的实例,包括程序计数器,寄存器和程序变量的当前值。


  • 进程有哪些特征?→

1.进程依赖于程序的运行而存在,进程是动态的,程序是静态的

2.进程是操作系统进行资源分配和调度的一个独立单位(CPU除外,线程是处理器任务调度和执行的基本单位);

3.每个进程拥有独立的地址空间,地址空间包括代码区,数据区和堆栈区,进程之间的地址空间是间隔的,互不影响


线程的基本概念:

  • 什么是线程?

🦉🦉定义:一个线程就是一个“执行流”,每个线程之间都可以按照顺序执行自己的代码,多个线程之间“同时”执行着多份代码

  • 为什么要用到线程?

⾸先, "并发编程" 成为 "刚需":

为了充分利用CPU的资源,避免出现“一核工作,多核围观”的情况,我们可以通过编写特殊的代码,把多个CPU核心,充分利用起来,这样的代码就称为“并发编程”,多进程的编程,就是一种典型的并发编程。虽然多进程能够解决问题,但是随着对于效率的要求越来越高,就希望有更好的方法来实现并发编程。而多进程的编程,最大的问题,就是进程太“重”,创建进程/销毁进程的开销比较大(时间,空间),一旦场景需要频繁的创建和销毁进程,开销就非常明显了→最典型的是服务器开发,针对每一个发出请求的客户端,都创建一个单独的进程,由这个进程负责给客户端提供服务。为了解决进程开销比较大的问题,就发明了线程(Thread),线程可以理解为更加轻量级的进程,也能解决开发并发程序的问题,但是创建/销毁的开销,要比进程更低。

进程和线程的区别与联系:

  • 1.进程包含线程:

一个进程里至少包含一个线程(主线程),也可以包含多个线程。不能没有线程

  • 2.进程是系统分配资源的基本单位

  • 3.线程是系统调度执行的基本单位

  • 4.同一个进程里的线程之间,共用一份系统资源(内存,硬盘,网络宽带等),尤其是内存资源,就是代码中定义的变量/对象等信息,编程中,多个线程,是可以共用同一份变量的~
  • 5.多线程是当下实现并发编程的主流方式,通过多线程,就可以充分利用好多核CPU。但是,也不是线程数目越多,就越好,线程数目达到一定程度,把多个核心都利用充分之后,此时继续增加线程,无法再提高效率,甚至可能会影响效率(线程的调度,也是有开销的)
  • 6.多个线程之间,可能会互相影响,线程安全问题。一个线程抛出异常,也可能会把其他线程一起带走 
  • 7.多个进程之间,一般不会互相影响,一个进程奔溃了,不会影响到其他进程(进程的隔离性)

🙃代码执行实列:

1.通过继承Thread父类来实现多线程

//1.通过继承Thread父类来实现进程
class MyThread extends Thread{@Overridepublic void run(){//这里写的代码,就是即将创建的线程,要执行的逻辑while(true){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {//throw new RuntimeException(e);e.printStackTrace();}}}
}
public class Demo1 {public static void main(String[] args) throws InterruptedException {MyThread t = new MyThread();//创建线程->运行hello main 和 hello thread 并发执行,同时打印t.start();//run 不会创建线程,也是再主线程中执行逻辑//t.run();只循环打印hello threadwhile(true){System.out.println("hello main");Thread.sleep(1000);}}
}

也可以通过匿名内部类来实现:

//通过匿名内部类来创建多线程
public class Demo3 {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(){@Overridepublic void run(){while(true){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}};t.start();while(true){System.out.println("hello main");Thread.sleep(1000);}}
}

运行结果:

2.通过实现Runnable接口来实现多线程:

//2.通过实现Runnable接口来实现多线程
class MyRunnable implements Runnable{//描述线程里要完成的逻辑是啥@Overridepublic void run() {while(true){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}
public class Demo2 {public static void main(String[] args) throws InterruptedException {MyRunnable runnable = new MyRunnable();Thread t = new Thread(runnable);t.start();while(true){System.out.println("hello main");Thread.sleep(1000);}}
}

也可以通过匿名内部类来实现:

public class Demo4 {public static void main(String[] args) throws InterruptedException {//通过匿名内部类来编写Thread t = new Thread(new Runnable() {@Overridepublic void run() {while(true){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}});t.start();while(true){System.out.println("hello main");Thread.sleep(1000);}}
}

3.通过Lambda表达式来实现多线程:

//通过lambda表达式来进行编写
public class Demo5 {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(()->{while(true){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();while(true){System.out.println("hello main");Thread.sleep(1000);}}
}

😇Thread类的常见属性和构造方法:

  • Thread类常见的构造方法:

  • Thread类常见的属性:

public class Demo6 {public static void main(String[] args) {Thread t = new Thread(()->{while(true){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}},"自定义线程");//->线程名字为自定义线程t.start();System.out.println("线程ID : " + t.getId());System.out.println("线程名字: " + t.getName());System.out.println("线程状态: " + t.getState());System.out.println("线程执行顺序:" + t.getPriority());}
}

运行结果:

Runnable正在运行,实际上Java没有Running这个线程状态,把正在CPU上运行,和随时可以调度到CPU上运行的,都统称为Runnable

  • 前台线程&后台线程

后台线程:如果这个线程执行过程中,不能阻止进程结束(虽然线程执行着,但是进程就要结束了,此时这个线程也会随之被带走)这样的线程就称为“后台线程”

前台线程:如果某个线程执行过程中,能阻止进程的结束,此时这个线程就是“前台线程”

前台线程和后台线程,主要是影响程序的退出

public class Demo7 {//设置前public static void main1(String[] args) {Thread t1 = new Thread(()->{while(true){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});t1.start();}//设置后public static void main(String[] args) {Thread t2 = new Thread(()->{while(true){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});//把 t 设置线程为后台线程(守护线程),不能在阻止程序结束了t2.setDaemon(true);t2.start();}
}

 结语: 写博客不仅仅是为了分享学习经历,同时这也有利于我巩固知识点,总结该知识点,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进。同时也希望读者们不吝啬你们的点赞+收藏+关注,你们的鼓励是我创作的最大动力!

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

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

相关文章

java调用GDAL及JTS实现生成泰森多边形(Voronoi图)的一种方法

目录 一、关于泰森多边形 1.泰森多边形的特性 2.本文的目的 二、实现思路 1.gdal和jts库的maven坐标 2.jts生成泰森多边形的关键代码 3.使用GDAL读取源文件信息的关键代码 4.使用GDAL将生成的泰森多边形写入文件 三、实现结果 1.实现的效果 2.完整代码示例 一、关于…

【稳定检索/投稿优惠】2024年智慧金融与财务管理国际会议(SFFM 2024)

2024 International Conference on Smart Finance and Financial Management 2024年智慧金融与财务管理国际会议 【会议信息】 会议简称:SFFM 2024 截稿时间:以官网为准 大会地点:中国广州 会议官网:www.iacsffm.com 会议邮箱&am…

【漏洞复现】海康威视综合安防管理平台 多处 FastJson反序列化RCE漏洞

0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 由于…

【安装笔记-20240607-Linux-适合个人用户及初创企业的 SSL 证书服务】

安装笔记-系列文章目录 安装笔记-20240607-Linux-适合个人用户及初创企业的 SSL 证书服务 文章目录 安装笔记-系列文章目录安装笔记-20240607-Linux-适合个人用户及初创企业的 SSL 证书服务 前言一、软件介绍名称:acme.sh主页官方介绍 二、安装步骤测试版本&#x…

React@16.x(21)渲染流程-更新

目录 1,更新的2种场景2,节点更新3,对比 diff 更新3.1,React 的假设3.1.2,key 2.1,找到了对比的目标2.1.1,节点类型一致1,空节点2,DOM节点3,文本节点4&#xf…

Nginx 配置防护 缓慢的 HTTP拒绝服务攻击+点击劫持:X-Frame-Options未配置

一 安全团队检测网站 1 检测到目标主机可能存在缓慢的HTTP拒绝服务攻击 缓慢的HTTP拒绝服务攻击是一种专门针对于Web的应用层拒绝服务攻击,攻击者操纵网络,对目标Web服务器进行海量HTTP请求攻击,直到服务器带宽被打满,造成了拒绝服务。 慢…

Flink SQL实践

环境准备 方式1:基于Standalone Flink集群的SQL Client 启动Flink集群 [hadoopnode2 ~]$ start-cluster.sh [hadoopnode2 ~]$ sql-client.sh ... 省略若干日志输出... Flink SQL> 方式2:基于Yarn Session Flink集群的SQL Client 启动hadoop集群…

使用difflib实现文件差异比较用html显示

1.默认方式&#xff0c;其中加入文本过长&#xff0c;需要换行&#xff0c;因此做 contenthtml_output.replace(</style>,table.diff td {word-wrap: break-word;white-space: pre-wrap;max-width: 100%;}</style>)&#xff0c;添加换行操作 ps&#xff1a;当前te…

内存经验分享

目录 内存统计工具 /proc/meminfo Buddy ​​​​​​​​​​​​​​Slub ​​​​​​​Procrank /proc/pid/smaps ​​​​​​​Dumpsys meminfo 内存评估 内存泄漏 Lmk 水位调整 内存统计工具 /proc/meminfo 可以提供整体内存信息&#xff0c;各字段表示的意思如…

mysql工具----dbForgeStudio2020

dbForgeStudio2020&#xff0c;除了基本的操作外&#xff0c;还具有可调试mysql存储过程的功能&#xff0c;是一个不可夺得的mysql软件工具。 本文的软件将简单介绍软件的安装方式&#xff0c;仅供学习交流&#xff0c;不可做它用。 1.安装软件&#xff0c;安装后&#xff0c…

【Linux操作系统】Linux中进程的五种状态:R、S、D、T、X以及僵尸进程、孤儿进程

操作系统中有许多同时执行的进程&#xff0c;这些进程都可能处于不同的状态代表着不同的含义。 R运行状态(running) 概念&#xff1a;并不意味着进程一定在运行中&#xff0c;它表明进程要么是在运行中要么在运行队列里。 我们运行可执行程序myproc利用指令 ps ajx可以看到进程…

BC9 printf的返回值

BC9 printf的返回值 这里我们先要了解库函数printf printf的返回值&#xff0c;是写入的字符总数 我们第一遍写代码时候可能写成这样: #include<stdio.h> int main() {int retprintf("Hello world!");printf("%d", ret);return 0; }我们发现这样是通…

问题:在本案复议阶段,复议机关()。 #其他#媒体

问题&#xff1a;在本案复议阶段&#xff0c;复议机关&#xff08;&#xff09;。 A&#xff0e;有权责令被申请人纠正违法的征税行为 B&#xff0e;应当对被申请人作出的税务具体行政行为所依据的事实证据、法律程序、法律依据及设定权利义务内容的合法性、适当性进行全面审…

【JMeter接口测试工具】第二节.JMeter基本功能介绍(上)【入门篇】

文章目录 前言一、获取所有学院信息接口执行二、线程组的介绍 2.1 并发和顺序执行 2.2 优先和最后执行线程组 2.3 线程组的设置细节三、HTTP请求的介绍四、查看结果树的配置使用总结 前言 一、获取所有学院信息接口执行 我们先针对一条简单的接口进行执行&#…

【Spring Cloud Alibaba】13.自建存储对象服务与集成(minio版)

文章目录 简介什么是云存储服务&#xff08;OSS&#xff09;为什么选择MiniIOMiniIO相关地址 搭建(docker)安装Docker部署MinIO创建存储桶配置存储桶设置存储桶可以直接在浏览器访问 集成到Spring Cloud Alibaba项目创建子模块引入依赖包项目结构配置文件工具类接口类测试 简介…

别让你的品牌失去声音,品牌策划如何成为你的王牌?

品牌策划可不仅仅是一个简单的概念&#xff0c;它是一门真正的艺术和科学。 它涉及到在确立品牌定位之后&#xff0c;进行一系列精心设计的传播和推广活动&#xff0c;从而塑造和管理品牌&#xff0c;让品牌价值达到最大化。 在这个竞争激烈的市场中&#xff0c;想要让你的品…

【人工智能】第三部分:ChatGPT的应用场景和挑战

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

FactoryTalk View Site Edition的VBA基本应用

第一节 在VBA中标签的读取和写入 本例要达到的目标是通过FactoryTalk View Site Edition&#xff08;以下简称SE&#xff09;的VBA来访问PLC中的下位标签&#xff0c;并实现标签的读写。 1.准备工作 打开SE&#xff0c;选择应用程序类型&#xff08;本例是Site Edition Netwo…

燃烧截稿倒计时,NDSS‘25大会即将召开,你的论文准备好了吗?

燃烧截稿倒计时&#xff01;NDSS25大会即将召开&#xff0c;你的论文准备好了吗&#xff1f; 第32届NDSS25(Network and Distributed System Security Symposium)即网络与分布式系统安全研讨会将于2025年2月23日至28日在加利福尼亚州圣地亚哥举行&#xff01; 作为信息安全领域…

【Python机器学习】将PCA用于cancer数据集并可视化

PCA最常见的应用之一就是将高维数据集可视化。一般对于有两个以上特征的数据&#xff0c;很难绘制散点图&#xff0c;。对于Iris&#xff08;鸢尾花&#xff09;数据集&#xff0c;我们可以创建散点矩阵图&#xff0c;通过展示特征所有可能的两两组合来展示数据的局部图像。 不…