文章插图
责编 | 胡巍巍
文章插图
线程
线程的概念,百度是这样解释的:
线程(英语:Thread)是操作系统能够进行运算调度的最小单位 。它被包含在进程之中,是进程中的实际运作单位 。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 。在Unix System V及SunOS中也被称为轻量进程(Lightweight Processes),但轻量进程更多指内核线程(Kernel Thread),而把用户线程(User Thread)称为线程 。
1.1 线程与进程的区别
文章插图
进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位 。
线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流 。线程——程序执行的最小单位 。
也就是,进程可以包含多个线程,而线程是程序执行的最小单位 。
1.2 线程的状态
文章插图
- NEW:线程刚创建
- RUNNABLE: 在JVM中正在运行的线程,其中运行状态可以有运行中RUNNING和READY两种状态 , 由系统调度进行状态改变 。
- BLOCKED:线程处于阻塞状态,等待监视锁,可以重新进行同步代码块中执行
- WAITING : 等待状态
- TIMED_WAITING: 调用sleep join wait方法可能导致线程处于等待状态
- TERMINATED: 线程执行完毕,已经退出
Notify和Wait 的作用
首先看源码给出的解释,这里翻译了一下:
Notify:唤醒一个正在等待这个对象的线程监控 。如果有任何线程正在等待这个对象,那么它们中的一个被选择被唤醒 。选择是任意的 , 发生在执行的酌情权 。一个线程等待一个对象通过调用一个{@code wait}方法进行监视 。
Notify需要在同步方法或同步块中调用,即在调用前,线程也必须获得该对象的对象级别锁
Wait:导致当前线程等待,直到另一个线程调用{@link java.lang.Object#notify}方法或{@link java.lang.Object#notifyAll}方法 。
换句话说 , 这个方法的行为就像它简单一样执行调用{@code wait(0)} 。当前线程必须拥有该对象的监视器 。
线程释放此监视器的所有权,并等待另一个线程通知等待该对象的监视器的线程,唤醒通过调用{@code notify}方法或{@code notifyAll}方法 。然后线程等待,直到它可以重新取得监视器的所有权,然后继续执行 。
Wait的作用是使当前执行代码的线程进行等待,它是Object类的方法,该方法用来将当前线程置入预执行队列中,并且在Wait所在的代码行处停止执行 , 直到接到通知或被中断为止 。
在调用Wait方法之前,线程必须获得该对象的对象级别锁,即只能在同步方法或同步块中调用Wait方法 。
Wait和Sleep的区别:
- 它们最大本质的区别是,Sleep不释放同步锁,Wait释放同步锁 。
- 还有用法的上的不同是:Sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用Interreput来强行打断;Wait可以用Notify直接唤起 。
- 这两个方法来自不同的类分别是Thread和Object
- 最主要是Sleep方法没有释放锁,而Wait方法释放了锁,使得其他线程可以使用同步控制块或者方法 。
- 相同 :Sleep和yield都会释放CPU 。
- 不同:Sleep使当前线程进入停滞状态 , 所以执行Sleep的线程在指定的时间内肯定不会执行;yield只是使当前线程重新回到可执行状态 , 所以执行yield的线程有可能在进入到可执行状态后马上又被执行 。Sleep可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield只能使同优先级的线程有执行的机会 。
死锁:指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去 。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程 。
死锁产生的四个必要条件(缺一不可):
推荐阅读
- iphone14技术规格
- 进程和线程:你了解它们的区别吗英语
- 阳光玫瑰葡萄大棚怎么建,阳光玫瑰葡萄种植技术与管理
- 荷兰豆种植 荷兰豆种植技术与管理
- 手机格式化照片用技术手段还会被恢复吗
- 蜜蜂怎么养殖 蜜蜂怎么养殖技术视频
- 物联网应用技术属于什么专业类别
- 现代式短跑技术强调的是什么跑法
- 蛋鸡养殖技术 蛋鸡养殖技术培训
- 物联网应用技术是什么