Maison  >  Article  >  Java  >  Statut du thread Java et sa signification

Statut du thread Java et sa signification

WBOY
WBOYavant
2023-04-21 18:01:161109parcourir

Pourquoi avez-vous besoin de comprendre l'état des threads Java

Le multithreading et la concurrence élevée sont une capacité que les développeurs juniors doivent maîtriser pour évoluer vers des développeurs intermédiaires et avancés. Un bâtiment vertigineux sort de terre. en profondeur, nous devons clarifier le concept le plus basique, c'est-à-dire quels sont les états des threads

Regardez quels sont les états des threads Java à partir du code source

Grâce à l'esprit open source, nous pouvons intuitivement analyser et. voyez quels sont les états des threads en Java. Tous les états des threads sont enregistrés en Java La classe d'énumération est

<code>java.lang.Thread.State</code> 

D'après le code source, nous pouvons voir qu'il y a un total de 6 états des threads en Java : NEW, RUNNABLE, BLOCKED. , WAITING, TIMED_WAITING, TERMINATED. Jetons un coup d'œil au code source détaillé, ainsi qu'à divers La signification de l'état du thread.

<code>public enum State {<br>    /**<br>     * 线程对象实例化但是还没有调用start方法.<br>     */<br>    NEW,<br><br>    /**<br>     * 线程处于可运行状态, 这个状态在虚拟机中<br>     * 看来是正在执行的, 但是实际可能在等待<br>     * 操作系统的资源, 比如等待CPU资源.<br>     * 注意Java线程状态只有RUNNABLE而没有RUNNING<br>     */<br>    RUNNABLE,<br><br>    /**<br>     * 阻塞状态的线程可能在等待获取锁,<br>     * 也可能是调用了wait方法后被notify方法<br>     * 唤醒, 再次尝试获取锁, 进入阻塞状态<br>     * {@link Object#wait() Object.wait}.<br>     */<br>    BLOCKED,<br><br>    /**<br>     * 等待状态, 此状态由于调用wait, join, park方法导致<br>     * <ul><br>     *   <li>{@link Object#wait() Object.wait} with no timeout</li><br>     *   <li>{@link #join() Thread.join} with no timeout</li><br>     *   <li>{@link LockSupport#park() LockSupport.park}</li><br>     * </ul><br>     *<br>     * 线程进入等待状态后, 等待notify, notifyAll,<br>     * 特定线程执行完毕, unpark方法<br>     * 然后转换为RUNNABLE状态<br>     */<br>    WAITING,<br><br>    /**<br>     * 有最大时间限制的等待状态<br>     * 可能由调用如下方法导致<br>     * <ul><br>     *   <li>{@link #sleep Thread.sleep}</li><br>     *   <li>{@link Object#wait(long) Object.wait} with timeout</li><br>     *   <li>{@link #join(long) Thread.join} with timeout</li><br>     *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li><br>     *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li><br>     * </ul><br>     */<br>    TIMED_WAITING,<br><br>    /**<br>     * 终止状态, 线程执行完毕后会进入<br>     * TERMINATED状态<br>     * 并且不能再转换成其它状态<br>     */<br>    TERMINATED;<br>}</code>  
  

10 lignes de code épuisent les 6 états des threads

Afin d'améliorer la mémoire, ci-dessous nous utilisez 10 codes efficaces pour afficher intuitivement les 6 états des threads Java.

<code>/**<br> * 如下展示了java线程的6种状态<br> * NEW 线程对象新创建还未start<br> * RUNNABLE 线程已经启动, 线程在JVM中正在运行, 不过在系统层面可能在等待系统资源<br> * BLOCKED 线程等待获取锁<br> * WAITING 线程被LockSupport#park(),<br> * Object#wait()或者Thread.join, 等待被unpark或者notify或者其他新城join完毕<br> * TIMED_WAITING 线程sleep或者wait(long),<br> * LockSupport#parkNanos LockSupport.parkNanos, 等待指定时间后继续执行<br> * TERMINATED 线程执行完毕, 已经被终止<br> * @throws BrokenBarrierException<br> * @throws InterruptedException<br> */<br>@Test<br>public void testThreadStatus() throws BrokenBarrierException, InterruptedException {<br>    CyclicBarrier cyclicBarrier = new CyclicBarrier(2);<br>    Thread thread = new Thread(() -> {<br>        try {<br>            LockSupport.park(this);<br>            TimeUnit.SECONDS.sleep(5);<br>            synchronized (ThreadTest.class) {<br>                // 尝试获取锁, 获取不到进入Blocked状态等待锁<br>            }<br>            cyclicBarrier.await();<br>        } catch (InterruptedException e) {<br>            e.printStackTrace();<br>        } catch (BrokenBarrierException e) {<br>            e.printStackTrace();<br>        }<br>    });<br>    log.info("线程创建还未启动, 状态为: {}", thread.getState());<br>    thread.start();<br>    log.info("线程已经启动, 状态为: {}", thread.getState());<br>    TimeUnit.SECONDS.sleep(1);<br>    log.info("线程已经park, 状态为: {}", thread.getState());<br>    LockSupport.unpark(thread);<br>    TimeUnit.SECONDS.sleep(3);<br>    log.info("线程启动后进入sleep状态, 状态为: {}", thread.getState());<br>    synchronized (ThreadTest.class) {<br>        // 前面sleep了4秒, 5到7秒main线程持有锁.<br>        // 子线程第6秒开始获取锁, 但需要等待main线程释放锁, 此时子线程是BLOCKED状态<br>        TimeUnit.SECONDS.sleep(3);<br>        log.info("线程等待锁, 状态为: {}", thread.getState());<br>    }<br>    cyclicBarrier.await();<br>    log.info("线程已经执行结束, 状态为: {}", thread.getState());<br>}</code> 

Le résultat de l'exécution est

<code>- 线程创建还未启动, 状态为: NEW<br>- 线程已经启动, 状态为: RUNNABLE<br>- 线程已经park, 状态为: WAITING<br>- 线程启动后进入sleep状态, 状态为: TIMED_WAITING<br>- 线程等待锁, 状态为: BLOCKED<br>- 线程已经执行结束, 状态为: TERMINATED</code>

Conversion de l'état du thread

Évitons l'organigramme fastidieux et décrivons brièvement la conversion mutuelle des états du thread.

  1. nouveau peut être converti en exécutez exécution, il entre dans l'état terminé

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer