专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java线程状态转换的情况介绍

Java线程状态转换的情况介绍

更新时间:2022-12-08 11:55:44 来源:星辉 浏览751次

Java线程状态转换有哪些情况?星辉小编来告诉大家。

情况1NEW–>RUNNABLE

​当调用t.start()方法的时候,由NEW–>Runnable

情况2RUNNABLE<–>WATTING

​ t线程用synchronize(obj)获得对象锁后:

​ 调用obj.wait()方法时,t线程从RUNNABLE–>WAITING

​ 调用obj.notify(),obj.notifyAll,t.interrupt时:

​ 竞争锁成功,t线程WAITING–>RUNNABLE

​ 竞争锁失败,t线程从WAITING–>BLOCKED

@Slf4j(topic = "c.TestWaitNotify")
public class TestWaitNotify {
    final static Object obj = new Object();
    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (obj) {
                log.debug("执行....");
                try {
                    obj.wait(); // 让线程在obj上一直等待下去
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                log.debug("其它代码....");
            }
        },"t1").start();
        new Thread(() -> {
            synchronized (obj) {
                log.debug("执行....");
                try {
                    obj.wait(); // 让线程在obj上一直等待下去
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                log.debug("其它代码....");
            }
        },"t2").start();
        // 主线程两秒后执行
        sleep(0.5);
        log.debug("唤醒 obj 上其它线程");
        synchronized (obj) {
//            obj.notify(); // 唤醒obj上一个线程
            obj.notifyAll(); // 唤醒obj上所有等待线程
        }
    }
}

情况3 RUNNABLE<–>WATTING

当前线程调用t.join()方法时,当前线程从RUNNABLE --> WAITING

注意是从当前线程在t线程对象的监视器上等待

t线程运行结束,活调用了当前线程的interrupt()时,当前线程从WAITING–> RUNNNABLE

情况4 RUNNABLE<–>WATTING

当前线程调用LockSupport.park()方法会让当前线程从RUNNABLE --> WAITING

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

情况5RUNNABLE<–>TIMED_WATTING

t线程用synchronize(obj)获取了对象锁后

调用obj.wait(long n)方法时,t线程从RUNABLE -->TIMED_WAITING

t线程等待时间超过了n毫秒,或调用obj.notify(),obj.notifyAll(),t.interrupt时

竞争锁成功,t线程从TIMED_WAITING -->RUNNABLE

竞争锁失败,t线程从TIMED_WAITING --> BLOCKED

情况6 RUNNABLE<–>TIMED_WATTING

当前线程调用t.join(long n) 方法是,当前线程从RUNNABLE --> TIMED_WAITING

注意是当前线程在t线程****对象的监视器上等待

当前线程等待时间超过了n毫秒,或t线程运行结束,调用了当前线程的interrupt()时,当前线程从TIMED_WAITING --> RUNNABLE

情况7 RUNNABLE<–>TIMED_WATTING

当前线程调用Thread.Sleep(long n) ,当前线程从RUNNABLE -->TIMED_WAITING

当前线程等待时间超过了n毫秒,当前线程从TIMED_WAITING -->RUNNABLE

情况8 RUNNABLE<–>TIMED_WATTING

当前线程调用LockSupport.parkNanos(long nanos) 或LockSupport.parkUntil(long millis)时,当前线程从RUNNABLE -->TIMED_WATTING

调用LockSupport.unpark(目标线程)或调用了线程的interrupt(),或是等待超时,会让目标线程从TIMED_WATTING–> RUNNABLE

情况9 RUNNABLE<–>BOLCKED

t线程用synchronized(obj)获取了对象锁时如果竞争失败,从RUNNABLE -->BLOCKED

持obj锁线程的同步代码块执行完毕,会唤醒该帝乡上所有的BLOCKED的线程重新竞争,如果其中t线程竞争成功,从BLOCKED -->RUNNABLE,其他失败的线程任然BLOCKED

情况10 RUNNABLE<–>TERMINATED

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

–>RUNNABLE,其他失败的线程任然BLOCKED

情况10 RUNNABLE<–>TERMINATED

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

以上就是关于“Java线程状态转换的情况介绍”,大家如果想了解更多相关知识,不妨来关注一下本站的Java多线程编程技术文档,里面还有更丰富的知识等着大家去学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>