java总结--线程
创始人
2025-05-31 10:57:23
0

什么是线程、什么是进程

进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。
线程是进程的一个执行单元,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一个进程中的多个线程之间可以并发执行。

多线程和多进程的区别

多进程就是系统中运行的程序,每一个程序就是一个进程
多线程是同一个程序中有多个顺序流在执行

基本概念:锁池和等待池

锁池

所有需要竞争同步锁的线程都会放在锁池当中,如果当前对象的锁已经被一个线程占用了,那么其他线程就会进入锁池中,等待这个对象锁的释放,释放后线程就会去竞争这个对象锁,竞争到的线程就会进入就绪队列,等待CPU资源分配。

等待池

当我们调用wait()方法后,线程就会放到等待池中,只有调用notify()或者notifyAll()后等待池的线程才会重新回归到就绪队列,等待CPU资源分配。
等待池中的线程是不会去竞争锁的。
notify()是随机从等待池中选出一个线程放回到锁池中,notifyAll()是将等待池中所有的线程放回到锁池。

堆是线程和进程共有的空间,在进程初始化的时候就会分配好,如果需要也还可以向系统索要,最后归还给操作系统。堆可以分为全局堆和局部堆。
在java中,堆是java虚拟机所管理的内存中最大的一块,所有线程共享堆空间,堆中存放对象的实例,几乎所有的对象实例和数组都在这里分配。在虚拟机启动时创建。

每个线程拥有一个栈空间,互相独立,每个线程都有自己的栈空间,切换线程时会自动切换栈,所以栈是线程安全的。

线程的生命周期

线程的生命周期
1、初始状态(NEW)
就是创建了一个线程(new)
2、就绪状态(RUNNABLE)
线程对象被创建后,其他线程调用该对象的start方法,线程位于可运行的线程池中,等待获取CPU的使用权。
3、运行状态
得到了CPU的使用权,执行代码
4、等待状态(WAITING)和超时等待状态(TIME_WAITING)
等待状态就是执行了wait()和join方法后程序进入等待状态
超时等待状态就是执行sleep()方法、等待状态也属于超时等待状态
5、阻塞状态(BLOCKED)
因为某种原因线程放弃了CPU的使用权,暂时停止运行,直到线程进入就绪状态,才有机会转到运行状态。
6、死亡状态(TERMINATED)
线程执行完或者因为异常退出了run方法,该线程生命周期结束

阻塞的情况有些什么:
1、等待阻塞:

sleep()、wait()、join()、yield()的区别

1、sleep()
sleep()是Thread类中的静态方法,调用会进入睡眠状态,也就是阻塞状态,是不会释放对象锁的。其实sleep()就是线程回立即释放CPU资源,不在运行此线程,但是当定时结束后会立即取回CPU资源继续运行,所以对象锁也是不会释放的。
在sleep期间,其他线程调用了该线程的interrupt方法,线程就会抛出interruptexception异常返回。
2、wait()
wait()是Object类中的方法,执行后会让线程进入等待池中,没有notify或者notifyAll方法是不会将线程重新放回到就绪状态。
对比:

  1. sleep是立即释放CPU资源,结束后马上占用CPU资源,wait不一样,wait是进入等待池中,回到就绪状态也是要去竞争CPU资源。
  2. sleep一般用于线程休眠(轮循操作),wait多用于线程之间的操作
  3. sleep不需要依赖synchronized,wait需要

3、yield()
yield就是立即释放CPU资源,进入就绪状态,谦让一下,如果释放后还是该线程抢到了CPU资源,那么久继续执行。
4、join()
join就是让线程进入阻塞状态,例如:B线程中执行a.start()开始了A线程
,然后在B线程中又执行了a.join(),这是B线程进入阻塞状态,等待A线程执行结束或者中断线程。

对线程安全的理解

应该说是内存安全,堆中的内存是共享的,所有线程都可以访问。
什么情况就说明线程是安全的:
就是多线程的去控制一个对象,最后的结果都应该是单线程是返回的结果。
如何去保证线程安全

  1. 原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);
  2. 可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized、volatile);
  3. 有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before 原则)。

创建线程的集中方式

1、继承Thread类创建线程
2、实现Tunnalbe接口创建线程
3、通过Callable和Future创建线程
4、通过线程池创建线程

对守护线程的理解

守护线程是为所有非守护线程服务的线程,任何一个守护线程都是整个JVM中所有非守护线程的保姆。守护线程对于进程就是一个小喽喽,为所有线程服务,如果其他线程都没有了,守护线程也就没有必要再工作了,直接中断。非守护线程的中断要看是否可以中断,符合才可以中断。而守护线程的中断是无法控制的,不要将IO,File等重要的操作逻辑给它。

注意:

  1. 守护线程的使用,thread.setDaemon(true),必须在thread.start开始之前,不能给正在运行的线程设置守护线程
  2. 守护线程中创建的线程也是守护线程
  3. 守护线程不能去访问IO、File等资源,因为没有办法控制守护线程的终止
  4. java自带的多线程框架会将守护线程自动转换为非守护线程,要使用守护线程就不能使用java的线程池

并发和并行的区别

并发强调的是“发”,共同出发,并行强调的“行”共同执行

Erlang 之父 Joe Armstrong画了一张图解释并发和并行,并发指的时两队人交替使用咖啡机,并行指的两队人可以同时使用两台咖啡机。
并发和并行
并发其实是一种现象,实际就是操作系统会调度不同的线程来让cpu执行,每个线程执行一会就先停下来,然后切换到另一个线程执行,切换的很快所以就产生了并发的现象。而并行就是共同执行。

相关内容

热门资讯

将 ChatGPT 与 实时聊... 人工智能技术是聊天营销人员的福音,而ChatGPT是这场革命的突破性新成员。人工智能工...
原创 4... “人到中年不得已,保温杯里泡枸杞!”可光泡枸杞哪够啊?您瞅瞅身边那些45岁往上的朋友——有人胃胀得像...
琴岛观澜丨山海之城的长红之道 ... 齐鲁晚报·齐鲁壹点 杨雪当华晨宇演唱会的音浪撞上小麦岛的海风,当《送你一朵小红花》的镜头扫过 “孤独...
根据经纬度判断点是否位于多边形... 最近,在业务中遇到一个场景,需要根据经纬度,判断一个点是否...
四川九寨沟乐山大佛旅游攻略跟团... 标题:【四川九寨沟乐山大佛旅游攻略跟团游6日游报价咨询,驴友亲测!】—— 跟着本地导游乐乐畅享川蜀之...
5年近10家4A级及以上景区破... 景区内1元一根的冰棍、2.5元一根的黄瓜让国内首家破产的5A级景区——龙潭大峡谷出了圈。与此同时,一...
零售数据分析之操作篇5:近期计... 各位数据的朋友,大家好,我是老周道数据,和你一起ÿ...
半导体器件基础05:肖特基二极... 说在开头:关于原子模型(2) 马上有物理学家就出来说了&#...
Linux系统调用之wait,... 前言 如果,想要深入的学习Linux系统调用中的wait,waitpid...
最少砝码(思维+找规律) 最少砝码 前n个可以表示0~k; 第n+1个为x(x>k);...
去四川旅游攻略当地团6日游一个... 深入四川的奇幻之旅 四川旅游推荐!当地导游-乐乐:185 8335 5758(加他微信-立减200)...
四川九寨沟峨眉山旅游参团6日游... 亲临仙境,探索四川的奇妙之旅 四川旅游推荐!当地导游-乐乐:185 8335 5758(加他微信-立...
【Linux】基础IO(一) ... 🍎作者:阿润菜菜 📖专栏:Linux系统...
从tomcat源码分析它的启动... 首先我们需要了解两个重要的知识点:一个是tomcat容器的总体结构, 一...
盘点:50%的人都认识的污水处... 污水处理是指被污染的水体经过净化,让其能够再次利用的过程。尽管地球表面2/3被水覆盖&...
Urban Radiance ... Urban Radiance Fields:城市辐射场 摘要:这项工作的目标是根据扫描...
原创 推... “从手到口,从口到心,中国人延续着对世界和人生特有的感知方式。只要点起炉火,端起碗筷,每个平凡的人,...
古贝春展位成德州新青年音乐节“... 大众网记者 张晓琳 徐瑞 德州报道 鼓点震动着夏夜热浪,数万名高举双臂的年轻人在音浪中舞动,古贝春的...
最优化算法 - 动态规划算法 动态规划算法简介 动态规划(Dynamic programming)是一...