首页 > 系统相关 >并发学习记录05:线程状态和操作系统中进程状态对比

并发学习记录05:线程状态和操作系统中进程状态对比

时间:2022-08-20 12:33:42浏览次数:54  
标签:状态 RUNNABLE obj 05 -- WAITING 线程 TIMED

操作系统中进程状态

1.运行态:进程正在处理机上运行。在单处理机的环境下,每个时刻只有一个进程处于运行态
2.就绪态:进程获得了除处理机外的一切所需资源,一旦得到处理机,就可以立刻运行。系统中处于就绪状态的进程可能有多个,通常把他们放到就绪队列中。
3.阻塞态:又叫等待态。进程正在等待某一事件,所以暂停运行。比如你在等待除处理机之外的某个资源可用,或者等待输入输出操作完成。这时候即使处理机空闲,这个进程仍然不能运行
4.创建态:进程正在被创建,还没被转到就绪态。因为其实创建进程也是需要多个步骤的:首先申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息,然后由系统为该进程分配运行时所需要的资源,最后把该进程转入就绪态
5.结束态:进程正从系统中消失,可能是正常结束也可能是中断退出运行,进程结束时,需要先置为结束态,然后再回收资源。

Java中线程的状态

NEW:线程刚被创建,但是还没有调用start()方法
RUNNABLE:当调用了start()方法后。Java中的RUNNABLE状态涵盖了操作系统中的就绪状态,运行状态和阻塞状态。
BLOCKED,WAITING,TIMED_WAITING是Java对于阻塞状态的划分
TERMINATED:当线程代码运行结束

线程状态转换

图示

解析

情况1:NEW->RUNNABLE

当调用t.start()方法时,由NEW->RUNNABLE

情况2:RUNNABLE<->WAITING

t线程调用synchronized(obj)获得了对象锁之后
*调用obj.wait()方法,t线程从RUNNABLE转为WAITING
*调用obj.notify(),obj.notifyAll()时,竞争锁成功,t线程从WAITING->RUNNABLE;竞争锁失败,t线程从WAITING变为BLOCKED

//通过以下代码验证竞争锁成功与失败之后线程状态的变化
@Slf4j(topic = "ch.TestWaitNotify04")
public class TestWaitNotify04 {
    final static Object obj = new Object();

    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            synchronized (obj) {
                log.debug("执行...");
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                log.debug("其他代码...");
            }
        }, "t1").start();
        new Thread(() -> {
            synchronized (obj) {
                log.debug("执行...");
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                log.debug("其他代码...");
            }
        }, "t2").start();
        Thread.sleep(50);
        log.debug("去唤醒");
        synchronized (obj) {
            obj.notifyAll();
        }
    }
}

情况3:RUNNABLE<->WAITING

当前线程调用 t.join() 方法时,当前线程从 RUNNABLE --> WAITING,注意是当前线程在t 线程对象的监视器上等待
t 线程运行结束,或调用了当前线程的 interrupt() 时,当前线程从 WAITING --> RUNNABLE

情况4:RUNNABLE <--> WAITING

当前线程调用 LockSupport.park() 方法会让当前线程从 RUNNABLE --> WAITING
调用 LockSupport.unpark(目标线程) 或调用了线程 的 interrupt() ,会让目标线程从 WAITING -->
RUNNABLE

情况5:RUNNABLE <--> TIMED_WAITING

t线程用 synchronized(obj) 获取了对象锁后
调用obj.wait(long n) 方法时,t 线程从 RUNNABLE --> TIMED_WAITING
t 线程等待时间超过了 n 毫秒,或调用 obj.notify() , obj.notifyAll() , t.interrupt() 时
竞争锁成功,t 线程从 TIMED_WAITING --> RUNNABLE
竞争锁失败,t 线程从 TIMED_WAITING --> BLOCKED

情况6:RUNNABLE <--> TIMED_WAITING

当前线程调用 t.join(long n) 方法时,当前线程从 RUNNABLE --> TIMED_WAITING
注意是当前线程在t线程对象的监视器上等待
当前线程等待时间超过了n毫秒,或t 线程运行结束,或调用了当前线程的 interrupt() 时,当前线程从
TIMED_WAITING --> RUNNABLE

情况7:RUNNABLE <--> TIMED_WAITING

当前线程调用 Thread.sleep(long n) ,当前线程从 RUNNABLE --> TIMED_WAITING
当前线程等待时间超过了 n 毫秒,当前线程从 TIMED_WAITING --> RUNNABLE

情况8:RUNNABLE <--> TIMED_WAITING

当前线程调用 LockSupport.parkNanos(long nanos) 或 LockSupport.parkUntil(long millis) 时,当前线程从 RUNNABLE --> TIMED_WAITING
调用 LockSupport.unpark(目标线程) 或调用了线程 的 interrupt() ,或是等待超时,会让目标线程从TIMED_WAITING--> RUNNABLE

情况9:RUNNABLE <--> BLOCKED

t 线程用 synchronized(obj) 获取了对象锁时如果竞争失败,从 RUNNABLE --> BLOCKED
持 obj 锁线程的同步代码块执行完毕,会唤醒该对象上所有 BLOCKED 的线程重新竞争,如果其中 t 线程竞争成功,从 BLOCKED --> RUNNABLE ,其它失败的线程仍然 BLOCKED

情况10:RUNNABLE <--> TERMINATED

当前线程所有代码运行完毕,进入TERMINATED

总结:阻塞线程的方法有wait,join,park。将线程阻塞一定时间的方法有wait(时间),join(时间),sleep(时间),parkNanos(时间)

标签:状态,RUNNABLE,obj,05,--,WAITING,线程,TIMED
From: https://www.cnblogs.com/wbstudy/p/16599163.html

相关文章

  • 信2105-3班张少阳20213904第八周java学习总结
    本周进一步深入学习了类以及接口的用法,区别以及类似点1.3接口的成员特点1)成员变量:只能是常量,默认修饰符publicstaticfinal2)构造方法接口没有构造方法,因为接口主要是......
  • 【Java进阶】五分钟快速掌握JVM优化概念、常用命令、工具、JUC、多线程、GC等知识
    〇、概述1、资料 2、内容概括 一、概念(一)JVM (二)JUC (三)GC二、命令(一)JVM优化命令 (二)JUC命令三、工具(一)jdk工具......
  • 线程同步
    线程同步的几个概念synchronized关键字synchronized,wait,notify是任何对象都具有的同步工具。wait/notify必须存在于synchronized块中。详情如下:方法或代码块的互斥......
  • 「atcoder - agc054c」Roughly Sorted
    link。高妙题,我只会到构造下界那一步……构造下界比较容易,只需要注意到交换一次最多让序列向合法迫近一步即可。则答案下界为\(\sum_i\max\{\left(\sum_{j<i}[p'_j......
  • 线程间操作无效: 从不是创建控件的线程访问它
    Winform跨线程调用控件时出错:线程间操作无效:从不是创建控件的线程访问它在窗体构造函数下添加 CheckForIllegalCrossThreadCalls=false;就可以忽略对跨线程的检测......
  • vue中使用tag标签根据状态显示不同颜色区分
    场景前端列表中有状态显示,会根据状态值的不同显示不同的颜色进行区分实战1、给tag增加颜色显示<Tagcolor="blue">标签一</Tag>2、根据值的不同需要增加判断<Tag:c......
  • Java 中的线程池
    线程池·语雀(yuque.com)为什么要用线程池在HotSpotVM的线程模型中,Java线程被一对一映射为内核线程。Java在使用线程执行程序时,需要调用操作系统内核的API,创建......
  • UE蓝图---实现场景物体Transform状态重置效果
    在工业领域应用中,通常会遇到操作场景模型变换的操作,经过了移动、旋转、缩放后,要求可一键重置还原最初的Transform状态。思路:1、在模型阶段设置每个模型Tag值为Ope......
  • 解决iframe页面之间的vuex状态管理
    公司有一个很老的saas平台项目,最近改成了vue3+vuex来处理,还是html页面,不是.vue的,花了很久的功夫,终于解决了iframe之间,vuex状态共享的问题,特此记录一下~/*解决iframe......
  • MFC实现Txt05之研究CRichEditView与OnDraw/Serialize/OnNewDocument
    首先明确声明,单文档CTestView继承CRichEditView,在此基础上研究分析所遇到的问题。 1、关于OnDraw函数:2、关于Serialize函数: 1、关于OnDraw:不知道有没有以及过,其实......