zoukankan      html  css  js  c++  java
  • 【笔记】java多线程 2 五种状态

    多线程的5种状态

    生:线程刚被创建出来,还没有进入可执行状态。

    可执行:线程执行start()方法,进入就绪(可执行)状态,但是如果cpu未空闲,就无法立即进入执行状态。

    执行:开始执行run()方法

    死:run()方法结束。

    睡眠|阻塞|等待:线程仍然活着,但没有运行,如果符合某事件,将重新回到可执行状态。

    睡眠

    Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)静态方法强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。当线程睡眠时,它入睡在某个地方,在苏醒之前不会返回到可运行状态。当睡眠时间到期,则返回到可运行状态。

    注意:

    1.sleep设置的时间是最短时间,而不是标准时间。sleep时间到期后,会进入可执行状态,而不是执行状态。

    2.sleep是静态方法,只能就当前的线程拖入睡眠状态。

     

    让步

    线程的让步是通过yeild()方法实现的。

    yeild()方法是暂停当前的线程,以执行其它线程。当前线程被执行yeild()方法后,会进入可执行状态。当yeild()执行后,程序根据各线程的优先级,可执行状态的线程中抽选优先级高的线程。因此当前的线程被yeild后,如果优先度依然最高,仍然会被执行。

     

    java线程的sleep(),wait(),notify(),yield()方法的区别要点

    1.sleep()使线程休眠一段时间,一段时间结束后,线程进入可执行状态,但并不是立即执行,只是在被排程器调用的时候才执行。在休眠期间,并不释放所持有的“锁”;

    2.wait()使线程休眠一段时间,若设置参数,时间到时,线程就自动进入可执行状态。若没有,则需要notify()方法去调用。注意:wait()方法和notify()方法都时针对this对象的,调用wait()方法后,会释放加在对象上的“锁”。

    3.yield()使线程放弃执行的权利,进入可执行状态,也就意味着线程在yield()方法后,有可能又执行。使用yield()方法,线程并不释放自己锁持有的“锁”。以允许具有相同优先级的其他线程获得运行机会,必须是让给相同优先级

    4、join()方法 
    Thread的非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作。例如:
            Thread t = newMyThread();
            t.start();
            t.join();
    另外,join()方法还有带超时限制的重载版本。 例如t.join(5000);则让线程等待5000毫秒,如果超过这个时间,则停止等待,变为可运行状态。
    线程的加入join()对线程栈导致的结果是线程栈发生了变化,当然这些变化都是瞬时的。

     

    interrupt()方法和stop()方法的区别

    1.interrupt():通知该线程中止,当改线程进行到阻塞状态时(sleep等),才会退出线程。

    2.stop():强行退出线程,有可能导致异常发生,所以不建议使用该方法。

  • 相关阅读:
    感觉每天打开自己的博客园, 想编程的心情就多了起来~~~
    算法图解相关代码整理
    github cli
    What's WebFlux ? And how to use it ? 一股有咖喱味的WebFlux简介
    style
    gradle 1
    gradle打包可运行jar
    外面下着雨
    天晴朗 看花儿多多开放
    Full Stack Reactive with React and Spring WebFlux
  • 原文地址:https://www.cnblogs.com/nonkicat/p/2685265.html
Copyright © 2011-2022 走看看