美文网首页
并发编程(八):线程转换

并发编程(八):线程转换

作者: codeMover | 来源:发表于2020-04-16 23:12 被阅读0次

Java中六种状态装换

  • NEW【初始状态】:仅创建了Java线程对象,还没有和操作系统的线程关联起来
  • RUNNABLE【运行状态、可运行状态、阻塞IO方法的阻塞状态】
线程状态转换.png

情况1 NEW --> RUNNABLE

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

情况2 RUNNABLE <--> WAITING

t线程调用synchronized(obj)获得对象锁后

  • 调用obj.wait()方法时,t线程从RUNNABLE --> WAITING
  • 调用obj.notify()、obj.notifyAll()、t.interrupt()时
    • 竞争锁成功,t线程从WAITING --> RUNNABLE
    • 竞争锁失败,t线程熊WAITING --> BLOCKED
@Slf4j(topic = "ants.RunableWaiting1")
public class RunableWaiting1 {
    public static void main(String[] args) throws InterruptedException {
        Object o = new Object();
        new Thread("t1") {
            @SneakyThrows
            @Override
            public void run() {
                synchronized (o){
                    log.debug("调用wait前");
                    o.wait();
                    log.debug("t1执行后续代码");
                }
            }
        }.start();

        new Thread("t2") {
            @SneakyThrows
            @Override
            public void run() {
                synchronized (o){
                    log.debug("调用wait前");
                    o.wait();
                    log.debug("t2执行后续代码");
                }
            }
        }.start();
        Thread.sleep(1000);
        synchronized (o){
            o.notifyAll();
        }
    }
}
@Slf4j(topic = "ants.RunableWaiting2")
public class RunableWaiting2 {
    public static void main(String[] args) throws InterruptedException {
        Object o = new Object();
        Thread t1 = new Thread("t1") {
            @SneakyThrows
            @Override
            public void run() {
                synchronized (o) {
                    log.debug("调用wait前");
                    o.wait();
                    log.debug("t1执行后续代码");
                }
            }
        };
        t1.start();
        Thread.sleep(10000);
        t1.interrupt();
    }
}

情况3 RUNNABLE <--> WAITING

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

情况4 RUNNABLE <--> WAITING

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

情况5 RUNNABLE <--> TIME_WAITING

t线程调用synchronized(obj)获得对象锁后

  • 调用obj.wait(long n)方法时,t线程从RUNNABLE --> TIME_WAITING
  • t线程等待时间超过了n毫秒,或调用object.notify()或obj.notifyAll()时
    • 竞争锁成功,t线程从TIME_WAITING --> RUNNABLE
    • 竞争锁失败,t线程从TIME_WAITING --> BLOCKED

情况6 RUNNABLE <--> TIME_WAITING

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

情况7 RUNNABLE <--> TIME_WAITING

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

情况8 RUNNABLE <--> TIME_WAITING

  • 当前线程调用LockSupport.parkNaos(long naos)或LockSupport.parkUtil(long millis)时,当前线程从RUNNABLE --> TIME_WAITING
  • 调用LockSupport.unpark(目标线程)或调用了线程的interrupt()或是等待时间超时,会让目标线程从TIME_WAITING --> RUNNABLE

情况9 RUNNABLE <--> BLOCKED

  • t线程调用synchronized(obj)获取了对象锁时,如果竞争失败进入EntryList阻塞,从RUNNABLE --> BLOCKED
  • 持有obj锁线程的同步代码块执行完毕,会唤醒EntryList阻塞的线程,线程重新竞争,如果t线程金正到锁资源从BLOCKED --> RUNNABLE,其他线程会继续是BLOCKED状态

情况10 RUNNABLE <--> TERMINATED

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

相关文章

  • 并发编程(八):线程转换

    Java中六种状态装换 NEW【初始状态】:仅创建了Java线程对象,还没有和操作系统的线程关联起来 RUNNAB...

  • Java-线程

    1.什么是线程 在并发编程中,有两个基本的执行单元:进程和线程。在Java编程语言中,并发编程主要关注线程。 线程...

  • 并发式编程

    并发编程以进程或者线程为为基本单位。 何为并发式编程? 真正的并发编程绝不是调用线程api,使用sunchroni...

  • T

    1 线程与进程概念2 实现多线程的两种手段,区别3 线程状态转换4 线程调度 优先级 并发编程的目的是为了让程序运...

  • 线程

    Java 并发编程:线程池的使用 Java 并发编程:线程池的使用java 多线程核心技术梳理 (附源码) 本文对...

  • Java并发编程(六)阻塞队列

    相关文章Java并发编程(一)线程定义、状态和属性 Java并发编程(二)同步Java并发编程(三)volatil...

  • Java并发编程(四)Java内存模型

    相关文章Java并发编程(一)线程定义、状态和属性 Java并发编程(二)同步Java并发编程(三)volatil...

  • Java并发编程(六)阻塞队列

    相关文章Java并发编程(一)线程定义、状态和属性 Java并发编程(二)同步Java并发编程(三)volatil...

  • Java并发编程(七)ConcurrentLinkedQueue

    相关文章Java并发编程(一)线程定义、状态和属性 Java并发编程(二)同步Java并发编程(三)volatil...

  • 并发编程

    并发编程三种构造并发程序的方式:基于进程的并发编程、基于IO多路复用的并发编程、基于线程的并发编程1、 基于进程...

网友评论

      本文标题:并发编程(八):线程转换

      本文链接:https://www.haomeiwen.com/subject/qagjvhtx.html