线程与进程

进程

进程是程序的一次执行过程,系统程序的基本单位。有自己的main方法,并且主要由主方法运行起来的基本上就是进程。

线程

线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享方法区资源,但每个线程有自己的程序计数器虚拟机栈本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

线程创建的方式
  1. 继承 Thread 类,重写 run 方法

  2. 实现 Runnable 接口,重写 run 方法

  3. 实现 Callable 接口,重写 call 方法

    这种形式与实现 Runnable 接口很像,但可以返回一个结果

  4. 线程池创建

之所以要重写 run 方法,是因为 run 方法内根本什么都没有,所以需要重写,赋予具体的功能。

线程的状态
  1. 新建(New):当线程对象被创建但还没有调用start()方法时,线程处于新建状态。在这个状态下,线程还没有开始执行。

  2. 就绪(Runnable):线程调用了start()方法后进入就绪状态。在这个状态下,线程已经准备好运行,等待操作系统分配CPU时间片。

  3. 运行(Running):当线程获得CPU时间片并开始执行时,它进入运行状态。在这个状态下,线程正在执行它的任务。

  4. 阻塞(Blocked):线程在等待某个事件(如I/O操作、获取锁、等待信号量等)时进入阻塞状态。在这个状态下,线程暂时停止执行,直到它等待的事件发生。

  5. 等待(Waiting):线程通过调用wait()join()park()等方法进入等待状态。在这个状态下,线程会无限期地等待,直到另一个线程调用notify()notifyAll()unpark()方法来唤醒它。

  6. 计时等待(Timed Waiting):线程通过调用具有超时参数的方法(如sleep(long)wait(long)join(long)parkNanos()parkUntil())进入计时等待状态。在这个状态下,线程会在指定的时间后自动恢复到就绪状态。

  7. 终止(Terminated):线程完成执行或因异常退出时进入终止状态。在这个状态下,线程不再执行,它的生命周期结束。

线程状态转换

线程的状态可以通过不同的操作进行转换,例如:

  • 从新建状态调用start()方法,线程进入就绪状态。

  • 从就绪状态获得CPU时间片,线程进入运行状态。

  • 从运行状态调用sleep(long)方法,线程进入计时等待状态。

  • 从运行状态调用wait()方法,线程进入等待状态。

  • 从运行状态调用join()方法,线程进入等待状态,等待另一个线程结束。

  • 从运行状态调用park()方法,线程进入等待状态。

  • 从阻塞状态等待的事件发生,线程进入就绪状态。

  • 从等待状态被notify()notifyAll()唤醒,线程进入就绪状态。

  • 从计时等待状态超时,线程进入就绪状态。

  • 从运行状态任务完成或抛出未捕获的异常,线程进入终止状态

当两个线程分别thread.start()时,只是将线程变成了就绪态,不是运行态,所以运行的顺序,还不一定。

wait(),join(),park()的区别
wait

wait()方法是Object类的一部分,因此所有对象都有这个方法。

wait 用于让一个线程进入等待状态,可以做到线程之间的通信,它会释放该对象的锁,并进入等待状态。直到其他线程调用同一个对象的notify()notifyAll()方法来唤醒它。

通常用于生产者-消费者模式中,当生产者生产数据后,生产者调用notify()notifyAll()来唤醒可能正在等待数据的消费者线程。

join

join()方法是Thread类的一部分。

join 用于控制线程之间的顺序。当一个线程调用另一个线程的join()方法时,它会阻塞自己,直到被调用的线程执行完毕。

例子:

public class Main{public static void main(String[] args) {System.out.println("Main 线程 开始运行!");Thread t1 = new Thread(){@Overridepublic void run(){System.out.println("t1 开始运行!");System.out.println("t1 结束运行!");}};try{t1.start();t1.join();}catch(Exception e){}System.out.println("Main 线程 结束运行!");}
}
​
​
/*
Main 线程 开始运行!
t1 开始运行!
t1 结束运行!
Main 线程 结束运行!
*/
park

park()方法是java.util.concurrent.locks.LockSupport类的一部分。

它更自由,park()方法用于暂停当前线程的执行。不需要像 wait 一样,需要持有特定的锁,它直接使用就可以。

线程与进程的关系,区别及优缺点?

图解关系

下图是 Java 内存区域,通过下图我们从 JVM 的角度来说一下线程和进程之间的关系。

Java 运行时数据区域(JDK1.8 之后)

从上图可以看出:一个进程中可以有多个线程,多个线程共享进程的方法区 (JDK1.8 之后的元空间)*资源,但是每个线程有自己的*程序计数器虚拟机栈本地方法栈

总结

线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。

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

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

相关文章

局域网语音对讲系统_IP广播对讲系统停车场解决方案

局域网语音对讲系统_IP广播对讲系统停车场解决方案 需求分析: 随着国民经济和社会的发展, 选择坐车出行的民众越来越多。在保护交通安全的同时,也给停车场服务部门提出了更高的要求。人们对停车场系统提出了更高的要求与挑战, 需要…

部分设计模式概述

单例模式 工厂模式 适配器模式 模板方法模式 策略模式 责任链 观察者模式(又叫发布订阅模式)

容器化Jenkins远程发布java应用(方式一:pipline+ssh)

1.创建pipline工程 2.准备工程Jenkinsfile文件(java目录) 1.文件脚本内容 env.fileName "planetflix-app.jar" env.configName "planetflix_prod" env.remoteDirectory "/data/project/java" env.sourceFile "/…

Leetcode - 周赛396

目录 一,3136. 有效单词 二,3137. K 周期字符串需要的最少操作次数 三,3138. 同位字符串连接的最小长度 四,3139. 使数组中所有元素相等的最小开销 一,3136. 有效单词 本题就是一道阅读理解题: 字符串长…

NSSCTF | [SWPUCTF 2021 新生赛]easy_sql

打开题目,提示输入一些东西,很显眼的可以看到网站标题为“参数是wllm” 首先单引号判断闭合方式 ?wllm1 报错了,可以判断为单引号闭合。 然后判断字节数(注意‘--’后面的空格) ?wllm1 order by 3-- 接着输入4就…

vue多选功能

废话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; <template><div class"duo-xuan-page"><liv-for"(item, index) in list":key"index"click"toggleSelection(item)":class"{ active: sel…

ue引擎游戏开发笔记(36)——为射击落点添加特效

1.需求分析&#xff1a; 在debug测试中能看到子弹落点后&#xff0c;需要给子弹添加击中特效&#xff0c;更真实也更具反馈感。 2.操作实现&#xff1a; 1.思路&#xff1a;很简单&#xff0c;类似开枪特效一样&#xff0c;只要在头文件声明特效变量&#xff0c;在fire函数中…

Leetcode—232. 用栈实现队列【简单】

2024每日刷题&#xff08;131&#xff09; Leetcode—232. 用栈实现队列 实现代码 class MyQueue { public:MyQueue() {}void push(int x) {st.push(x);}int pop() {if(show.empty()) {if(empty()) {return -1;} else {int ans show.top();show.pop();return ans;}} else {i…

Burp Suite 抓包,浏览器提示有软件正在阻止Firefox安全地连接到此网站

问题现象 有软件正在阻止Firefox安全地连接到此网站 解决办法 没有安装证书&#xff0c;在浏览器里面安装bp的证书就可以了 参考&#xff1a;教程合集 《H01-启动和激活Burp.docx》——第5步

金蝶BI应收分析报表:关于应收,这样分析

这是一张出自奥威-金蝶BI方案的BI应收分析报表&#xff0c;是一张综合运用了筛选、内存计算等智能分析功能以及数据可视化图表打造而成的BI数据可视化分析报表&#xff0c;可以让企业运用决策层快速知道应收账款有多少&#xff1f;账龄如何&#xff1f;周转情况如何&#xff1f…

ARTS Week 27

Algorithm 本周的算法题为 58. 最后一个单词的长度 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#xff1a;输入&#xff1a…

JAVA基础面试题(第十一篇)上! JVM

Hello好久不见&#xff01;&#xff0c;最近我们讲更新JVM部分的面试题。 JVM 这块比较难理解&#xff0c;而且也是不擅长的点。所以今天我更新一下JVM希望小伙伴们能在面试中取得好成绩&#xff01; JVM 1. 什么是JVM内存结构&#xff1f; jvm将虚拟机分为5大区域&#xff0…

上市公司-库存周转率、供应链效率明细数据集(2000-2022年)

01、数据介绍 库存周转率是衡量企业库存管理效率的关键指标之一&#xff0c;它反映了企业库存的流转速度。而供应链效率则体现了企业在整个供应链管理中的表现&#xff0c;包括采购、生产、物流等环节的协同和优化。 提高库存周转率和供应链效率是上市公司优化企业运营和管理…

ICode国际青少年编程竞赛- Python-2级训练场-识别循环规律2

ICode国际青少年编程竞赛- Python-2级训练场-识别循环规律2 1、 for i in range(3):Dev.step(3)Dev.turnRight()Dev.step(4)Dev.turnLeft()2、 for i in range(3):Spaceship.step(3)Spaceship.turnRight()Spaceship.step(1)3、 Dev.turnLeft() Dev.step(Dev.x - Item[1].…

编译和链接(超详细)

✅博客主页:爆打维c-CSDN博客​​​​​​ &#x1f43e; &#x1f539;分享c语言知识及代码 一、编译和链接实例 假设我们有一个名为main.c的C语言源文件&#xff0c;它包含了一个简单的Hello World程序。我们可以使用gcc编译器对该源文件进行编译&#xff0c;生成一个可执行…

AI大模型探索之路-训练篇18:大语言模型预训练-微调技术之Prompt Tuning

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

亚马逊是如何铺设多个IP账号实现销量大卖的?

一、针对亚马逊平台机制&#xff0c;如何转变思路&#xff1f; 众所周知&#xff0c;一个亚马逊卖家只能够开一个账号&#xff0c;一家店铺&#xff0c;这是亚马逊平台明确规定的。平台如此严格限定&#xff0c;为的就是保护卖家&#xff0c;防止卖家重复铺货销售相同的产品&a…

【读论文】Gaussian Grouping: Segment and Edit Anything in 3D Scenes

Gaussian Grouping: Segment and Edit Anything in 3D Scenes 文章目录 Gaussian Grouping: Segment and Edit Anything in 3D Scenes1. What2. Why3. How3.1 Anything Mask Input and Consistency3.2 3D Gaussian Rendering and Grouping3.3 Downstream: Local Gaussian Editi…

10000 字详细讲解 Spring 中常用注解及其使用

如下图京东购物页面&#xff0c;当我们选择点击访问某一类商品时&#xff0c;就会向后端发起 HTTP 请求&#xff0c;当后端收到请求时&#xff0c;就会找到对应的代码逻辑对请求进行处理&#xff0c;那么&#xff0c;后端是如何来查找处理请求相对应的代码呢&#xff1f;答案就…

计算机考研|25人太难了,408会炸,还是自命题会炸?

自命题已经不是炸不炸的问题了&#xff0c;是有没有学上的问题。 我记得去年九月一些学校宣布改考408的时候&#xff0c;整个群里都炸了&#xff0c;同学一片哀嚎。要知道九月的时候要重新准备408肯定是不可能了&#xff0c;一来408复习的基础阶段已经过去了&#xff0c;二来英…