[Java]Java线程的六种状态和切换的条件

java线程有六种状态:NEW,TERMINATE,RUNNABLE和三种阻塞状态:WAITING,TIMED_WAITING,BLOCKED

首先,需要明确的是这六种状态是对应的java代码中的thread的状态,和真实存在于内核中的线程pcb状态有一定的关系,但是又和pcb的状态是完全区分开的两个东西

NEW :NEW状态指在java代码中已经创建了thread,但是这个thread还没有被start,也就是没有被内核创建pcb时的状态

public static void main(String []args){
    Thread t1=new Thread(()->{
        System.out.println("ti线程执行");
    });
    
    //没有调用start函数,此时线程为new状态
}

RUNNABLE:RUNNABLE状态表示java中的thread已经被创建了,且已经被start了,在内核中也有与thread对应的pcb被创建,并且这个pcb的状态是运行状态或者就绪状态;

public static void main(String []args){
    Thread t1=new Thread(()->{
        System.out.println("ti线程执行");
    });
    //调用了start,此时为runnable状态
    t1.start();

}

TERMINATE:这个状态对应的是thred在内核的pcb已经完成了任务后,被销毁了,但是java中的thread对象并没有被释放,此时java为了表示这个对象的状态,就产生了这个TERMINATE这个状态

public static void main(String []args){
    Thread t1=new Thread(()->{
        System.out.println("ti线程执行");
    });
    //调用了start,此时为runnable状态
    t1.start();
   try {
    //在哪个线程里面调用join,这个线程将会阻塞,直到调用join的线程对象的任务被执行完才会唤醒阻塞的线程
    //此代码main和t1是两个线程,main线程里面的ti线程实例对象调用了join,main线程等待ti执行完,才会被唤醒
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    //join后的代码被执行时,代表ti线程的任务已经被执行完
    //此时线程的状态为terminated
}

从上面三个状态的描述可以看出,java中线程对象的状态不能和内核中的线程完全同步的创建和释放,所以在java内部需要对线程对象的状态有自己的描述,所以才产生java线程的状态

TIMED_WATING:这个状态指有时间限制的阻塞状态,就是这个线程的阻塞状态被要求维持一定的时间,这个状态就是由线程调用sleep(time)或者wati(time)方法来实现的,调用这个方法就会使线程阻塞time的时长;

public static void main(String []args){
    Thread t1=new Thread(()->{
        System.out.println("ti线程执行");
        try {
            t1.sleep(1000);
            //执行完sleep()的线程状态为timedwaiting状态
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
    });
    
    t1.start();

}

BLOCKED:这个状态是当两个线程都要访问一个被加锁(被synchronized修饰)的方法或者代码块时产生的,先访问的这个方法的线程可以访问到这个方法并运行,后来的线程需要判断是否这个被加锁的方法有线程在调用,如果是就要进入BLOCKED状态,当先来的线程执行完加锁的方法后才会唤醒这个Blocked状态的进程

synchronized public void func(){
    //被synchronized修饰的方法
    System.out.println("synchronized方法调用");
}
public static void main(String []args){
    Thread t1=new Thread(()->{
        while(true){
            func();
            System.out.println("t2线程执行");
        }
    });
    Thread t2=new Thread(()->{
        while(true){
            func();
            System.out.println("t2线程执行");
        }
    });
    //调用了start,此时为runnable状态
    t1.start();
    t2.start();
    //由于t1,t2两个线程一直在循环执行,总有一次两个线程都同时在调用func(),此时谁后调用,谁就切换为bolcked状态

}

WAITING:调用wait()方法且不在括号内传入时间参数,此时线程的状态就会被切换为waiting状态,会一直等待,直到notify()唤醒这个线程 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值