精华内容
下载资源
问答
  • java多线程状态

    2021-03-15 16:22:43
    java线程状态在Thread中定义,源码中能看到有枚举State,总共定义了六种状态:NEW: 新建状态线程对象已经创建,但尚未启动RUNNABLE:就绪状态,可运行状态,调用了线程的start方法,已经在java虚拟机中执行,...

    java线程状态在Thread中定义,源码中能看到有个枚举State,总共定义了六种状态:

    NEW: 新建状态,线程对象已经创建,但尚未启动

    RUNNABLE:就绪状态,可运行状态,调用了线程的start方法,已经在java虚拟机中执行,等待获取操作系统资源如CPU,操作系统调度运行。

    BLOCKED:堵塞状态。线程等待锁的状态,等待获取锁进入同步块/方法或调用wait后重新进入需要竞争锁

    WAITING:等待状态。等待另一个线程以执行特定的操作。调用以下方法进入等待状态。 Object.wait(), Thread.join(),LockSupport.park

    TIMED_WAITING: 线程等待一段时间。调用带参数的Thread.sleep, objct.wait,Thread.join,LockSupport.parkNanos,LockSupport.parkUntil

    TERMINATED:进程结束状态。

    状态之间的转换状态图,总结了下,如下:

    2d255d75142fecea0bc37ad2629d70b7.png

    其中,Thread.sleep(long)使线程暂停一段时间,进入TIMED_WAITING时间,并不会释放锁,在设定时间到或被interrupt后抛出InterruptedException后进入RUNNABLE状态; Thread.join是等待调用join方法的线程执行一段时间(join(long))或结束后再往后执行,被interrupt后也会抛出异常,join内部也是wait方式实现的。

    wait方法是object的方法,线程释放锁,进入WAITING或TIMED_WAITING状态。等待时间到了或被notify/notifyall唤醒后,回去竞争锁,如果获得锁,进入RUNNABLE,否则进步BLOCKED状态等待获取锁。

    下面是一个小例子,主线程中调用多线程,等待超时后如果子线程还未结束,则中断子线程(interrupt)。

    e2d5a895e56a32d6a53fe42033adc0cd.png

    2fa1a6fc62a95ad8f36b0197ced1e0f3.png

    转载:https://baijiahao.baidu.com/s?id=1574105592023615&wfr=spider&for=pc

    展开全文
  • Java线程状态有哪

    2021-03-21 08:34:15
    1、新建(New):创建后尚未启动的线程处于这种状态。2、运行(Runnable):包括操作系统线程状态中的Running和Ready,也就是处于此状态线程有可 能正在执行,也有可能正在等待着操作系统为它分配执行时间。3、无限期...

    cd02d15cb27af2b5a3a6405b1a55f5fd.png

    1、新建(New):创建后尚未启动的线程处于这种状态。

    2、运行(Runnable):包括操作系统线程状态中的Running和Ready,也就是处于此状态的线程有可 能正在执行,也有可能正在等待着操作系统为它分配执行时间。

    3、无限期等待(Waiting):处于这种状态的线程不会被分配处理器执行时间,它们要等待被其他线程显式唤醒。以下方法会让线程陷入无限期的等待状态:

    没有设置Timeout参数的Object::wait()方法;

    没有设置Timeout参数的Thread::join()方法;

    LockSupport::park()方法。

    4、限期等待(Timed Waiting):处于这种状态的线程也不会被分配处理器执行时间,不过无须等待被其他线程显式唤醒,在一定时间之后它们会由系统自动唤醒。以下方法会让线程进入限期等待状态:

    设置了Timeout参数的Object::wait()方法;

    设置了Timeout参数的Thread::join()方法;

    LockSupport::parkNanos()方法;

    LockSupport::parkUntil()方法。

    5、阻塞(Blocked):线程被阻塞了,“阻塞状态”与“等待状态”的区别是“阻塞状态”在等待着获取到 一个排它锁,这个事件将在另外一个线程放弃这个锁的时候发生;而“等待状态”则是在等待一段时 间,或者唤醒动作的发生。在程序等待进入同步区域的时候,线程将进入这种状态。

    6、结束(Terminated):已终止线程的线程状态,线程已经结束执行。

    以上就是Java线程的六种状态,希望能对大家有所帮助。更多Java学习指路:

    展开全文
  • java线程有哪状态发布时间:2020-07-24 16:16:22来源:亿速云阅读:88作者:Leah今天就跟大家聊聊有关java线程有哪状态,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,...

    java线程有哪几种几种状态

    发布时间:2020-07-24 16:16:22

    来源:亿速云

    阅读:88

    作者:Leah

    今天就跟大家聊聊有关java线程有哪几种几种状态,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。java线程的5种状态:1、初始状态。2、可运行状态,位于可运行线程池中,等待被线程调度选中,获取cpu的使用权。3、运行状态。4、阻塞状态,指线程因为某种原因放弃了cpu使用权。5、死亡状态,死亡的线程不可再次复生。

    Java中的线程的生命周期大体可分为5种状态。

    1、初始状态(NEW):新创建了一个线程对象。

    2、可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权 。

    3、运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。

    4. 阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。阻塞的情况分三种:(1)、等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。

    (2)、同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。

    (3)、其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。

    5、死亡(DEAD):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

    一、线程的状态图

    20b42128d69467e604a37a1445951c04.png

    二、初始状态

    实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态

    三、可运行状态

    1、可运行状态只是说你资格运行,调度程序没有挑选到你,你就永远是可运行状态。

    2、调用线程的start()方法,此线程进入可运行状态。

    3、当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入可运行状态。

    4、当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入可运行状态。

    5、锁池里的线程拿到对象锁后,进入可运行状态。

    四、运行状态

    线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。

    五、死亡状态

    1、当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。

    2、在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

    六、阻塞状态

    1、当前线程T调用Thread.sleep()方法,当前线程进入阻塞状态。

    2、运行在当前线程里的其它线程t2调用join()方法,当前线程进入阻塞状态。

    3、等待用户输入的时候,当前线程进入阻塞状态。

    七、等待队列(本是Object里的方法,但影响了线程)

    1、调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) 代码段内。

    2、与等待队列相关的步骤和图线程1获取对象A的锁,正在使用对象A。

    线程1调用对象A的wait()方法。

    线程1释放对象A的锁,并马上进入等待队列。

    锁池里面的对象争抢对象A的锁。

    线程5获得对象A的锁,进入synchronized块,使用对象A。

    线程5调用对象A的notifyAll()方法,唤醒所有线程,所有线程进入锁池。||||| 线程5调用对象A的notify()方法,唤醒一个线程,不知道会唤醒谁,被唤醒的那个线程进入锁池。

    notifyAll()方法所在synchronized结束,线程5释放对象A的锁。

    锁池里面的线程争抢对象锁,但线程1什么时候能抢到就不知道了。||||| 原本锁池+第6步被唤醒的线程一起争抢对象锁。

    9ac5c823aedaba62d123e411d7325589.png

    八、锁池状态

    当前线程想调用对象A的同步方法时,发现对象A的锁被别的线程占有,此时当前线程进入锁池状态。简言之,锁池里面放的都是想争夺对象锁的线程。

    当一个线程1被另外一个线程2唤醒时,1线程进入锁池状态,去争夺对象锁。

    锁池是在同步的环境下才有的概念,一个对象对应一个锁池。

    九、几个方法的比较

    Thread.sleep(long millis),一定是当前线程调用此方法,当前线程进入阻塞,但不释放对象锁,millis后线程自动苏醒进入可运行状态。作用:给其它线程执行机会的最佳方式。

    Thread.yield(),一定是当前线程调用此方法,当前线程放弃获取的cpu时间片,由运行状态变会可运行状态,让OS再次选择线程。作用:让相同优先级的线程轮流执行,但并不保证一定会轮流执行。实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。Thread.yield()不会导致阻塞。

    t.join()/t.join(long millis),当前线程里调用其它线程1的join方法,当前线程阻塞,但不释放对象锁,直到线程1执行完毕或者millis时间到,当前线程进入可运行状态。

    obj.wait(),当前线程调用对象的wait()方法,当前线程释放对象锁,进入等待队列。依靠notify()/notifyAll()唤醒或者wait(long timeout)timeout时间到自动唤醒。

    obj.notify()唤醒在此对象监视器上等待的单个线程,选择是任意性的。notifyAll()唤醒在此对象监视器上等待的所有线程。

    看完上述内容,你们对java线程有哪几种几种状态有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

    展开全文
  • 面试官: 画图给我说一下线程有哪状态,以及各个状态间的转换。 阿满: 这TM鬼才会啊,哪有直接让你画图的,一下子全画出来怎么可能,T T。 下面我们就来一步步的把这图画出来,让面试官Bi嘴 这里初次记忆...

    面试官:
     画个图给我说一下线程有哪几种状态,以及各个状态间的转换。
     
    阿满:
     这TM鬼才会啊,哪有直接让你画图的,一下子全画出来怎么可能,T T。

    下面我们就来一步步的把这个图画出来,让面试官B嘴
    线程间状态转换

    这里初次记忆起来可能比较困难,不过不用担心,因为后续随着线程间各种方法的学习和使用,自然而然就会慢慢理解了。
    为了让大家更好的记忆,我们一起来理一遍。
    主要流程:

    1. 实例化,也就是new一个线程以后,线程就进入了初始化的阶段。2.调用线程的start方法,线程进入运行状态。3. 线程执行完毕,进入中止状态。
      各种分支流程。1. 共性:都是由运行状态变换开去的。
    2. 运行状态包含了2种,运行中 以及 就绪,这2种线程的切换主要是通过cpu的调度以及线程主动调用yield()方法,背后实现就是让出cpu的时间片进去就绪状态,然后获取到cpu的时间片,进入到运行中的状态。
    3. 运行状态<—> 等待状态。这里分为2类方法,一类是Object类的2个方法,wait() 和join()。一类是JUC包下的LockSupport的park()方法。相对的,从等待到运行,就是Object类的notify(),notifyAll()以及LockSupport的unpark(Thread)方法。
    4. 运行状态<—>超时等待状态。这里分为3类,一类是Thread类的方法,包括sleep(long),join(long),一类是Object类的方法,wait(long),另外一类是LockSupport类的方法,parkNacos()以及parkUntil()方法。从超时等待到运行状态,分为2类方法,一类是Object类的notify(),一类是notifyAll(),另外一类是LockSupport类的unpark(Thread)方法。
    5. 运行状态<—> 阻塞状态。这里主要是线程在等待获取锁的时候的状态转换,如果所需要获取的锁当前被其他线程占用(准确说是锁了某个线程中的某个对象或代码块),则会进入阻塞状态,当阻塞状态的线程获取到锁后,则进入运行状态。
    展开全文
  • 但与synchronized关键字原理不一样,synchronized关键字是根据对象头的锁标志判断当前线程是否可以获得锁,而重入锁是基于AbstractQueuedSynchronizer,底层是CAS,是一种乐观锁(无锁)。重入锁的基本使用如下:...
  • 线程状态转换

    千次阅读 2020-12-21 11:49:03
    线程一共有以下状态:1、新建状态(New):新创建了一个线程对象。2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态线程位于“可运行线程池”中,变得可运行,只等待获取CPU...
  • 原标题:多线程到底该设置多少线程?我们在使用线程池的时候,会有两疑问点:线程池的线程数量设置过多会导致线程竞争激烈如果线程数量设置过少的话,还会导致系统无法充分利用计算机资源那么如何设置才不会影响...
  • 2、RUNNABLE表示线程正在正常运行中,当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等,这个状态下发生的等待一般是其他系统资源,而不是锁、Sleep等。(视频教程推荐:java视频)3、BLOCKED此状态下,是在...
  • 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口同步的实现方面有两种,分别是synchronized,wait与notifywait():使一线程处于等待状态,并且释放所持有的对象的lock。sleep():使一正在运行的线程...
  • java线程几状态介绍

    2021-03-02 10:09:55
    下面画出线程五大状态之间的关系图:(1)新建状态:即单纯地创建一个线程,创建线程有三种方式,在我的博客:线程的创建,可以自行查看!(2)就绪状态:在创建了线程之后,调用Thread类的start()方法来启动一个线程,...
  • 线程可以有六种状态:1.New(新创建)2.Runnable(可运行)(运行)3.Blocked(被阻塞)4.Waiting(等待)5.Timed waiting(计时等待)6.Terminated(被终止)新创建线程:当用new操作符创建一线程时...
  • 线程状态? 1.线程的五种状态是:创建状态、就绪状态、运行状态、阻塞状态和死亡状态 新建状态(new):就是使用new方法创建新线程对象,线程进入新建状态,例如:Thread thread=new Thread(); 就绪状态...
  • java 实现多线程几种方式

    千次阅读 2021-02-01 15:29:14
    继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一实例,它代表一线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一
  • 线程状态有哪种?它们之间是如何转换的? 1、线程状态分类 线程一共有六种状态,分别为 New、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED,同一时刻只有一种状态,通过线程的 getState 方法可以获取...
  • 新建状态(New):新创建了一个线程对象。 (2).就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start方法。该状态线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。 (3).运行状态...
  • 尤其是当线程启动以后,它不可能一直"霸占"着CPU独自运行,所以CPU需要在线程之间切换,于是线程状态也会次在运行、阻塞之间切换。 1.线程通常有5种状态:创建、就绪、运行、阻塞和死亡状态。 (1)新建状态...
  • 2006 年 8 月 14 日Java 提供了语言级别的线程支持,所以在 Java 中使用多线程相对于 C,C++ 来说更简单便捷,但...在本文中,我们将讨论如何实现一 Java 多线程的运行框架以及我们是如何来控制线程的并发同步以及...
  • 1@1 I'm Thread-5@1 I'm Thread-2@2 I'm Thread-3@2 I'm Thread-4@2 I'm Thread-1@2 I'm Thread-5@2 从代码和执行结果我们可以看出,多线程程序的执行顺序是不确定的。当执行到sleep语句时,线程将被阻塞(Blocked)...
  • 线程状态先来个开场四连问Java线程状态几个?Java线程状态是如何转换?Java线程状态转换什么情况会进入锁的等待队列?Java线程状态转换什么情况会进入锁的同步队列?一提到Java线...
  • Java 多线程(超详细)

    千次阅读 2021-01-12 21:14:38
    多线程学习思路:为什么学习线程?为了解决CPU利用率问题,提高CPU利用率。 =》 什么是进程?什么是线程? =》 怎么创建线程?有哪种方式?有什么特点? =》 分别怎么启动线程? =》 多线程带来了数据安全问题,该...
  • Java多线程

    2021-02-28 14:03:03
    静态方法和普通方法同时加上synchronized有什么区别?A. 无论synchronized关键字加在方法上还是... 每对象只有一锁(lock)与之相关联,谁拿到这锁谁就可以运行它所控制的那段代码。C. 实现同步是要很大的系统开...
  • Qt的四种多线程讲解

    2021-04-12 08:50:16
    Qt 提供了对线程的支持,包括一组与平台无关的线程类,一线程安全的发送事件和跨线程的信号-槽关联。 通常有四种方式来实现多线程Qt程序。
  • Day13 多线程3).多线程的好处:提高程序的运行效率,提高用户的体验度。 线程不会因为等待某个资源而进入等待状态创建新的线程:* 定义类继承Thread* 重写方法run* 创建Thread子类的对象* 调用子类对象的方法start()*...
  • IO与线程状态

    2021-03-16 18:46:59
    天在看IO和NIO,说IO是阻塞的,当多个IO访问服务器时,发生阻塞的时候,CPU要不停的轮询每IO的线程,看哪个IO的阻塞解除。会浪费CPU资源。然后我看了线程状态分类,专门有人说过阻塞和同步是不一样的。1、...
  • 【Java多线程】Thread的几个方法

    万次阅读 2021-10-03 21:33:18
    结果是两个线程同时运行:当前线程(从调用返回到start方法)和另一个线程(执行其run方法)。 不止一次启动线程是不合法的。特别地,一旦线程完成执行就可能不会重新启动。 异常:IllegalThreadStateException - ...
  • 线程状态

    2021-02-24 22:20:31
    1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。 2.运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。 线程对象创建后,其他线程(比如main线程)调用了该...
  • Java多线程技能

    2021-03-01 08:14:53
    线程的启动* 线程的暂停* 线程停止* 线程的优先级* 线程安全的相关问题一、进程要学习多线程就不得不提到进程,进程是什么,当我们打开windows系统的任务管理器里面运行着的.exe文件可以被看作是一个个进程。...
  • 请问Java中线程状态有哪些? 有人不假思索的回答:New,Runnable,Running,...按照图一可以将线程状态解释为:New 新建状态、Runnable就绪状态(细分为Ready准备状态与Running运行状态)、Wating等待状态(细分为Watin
  • 我们都知道,代码编程不是固定的东西,而是非常灵活的内容,根据不同的内容,我们可以拓展出很多条内容,最终目的还是为了可以实现结果,给大家举例说明其中一最常用的多线程吧~以及实现的种方式。1. 用函数创建...
  • 一文搞懂Java的多线程底层逻辑,再也不怕多线程

    多人点赞 热门讨论 2021-09-19 21:44:41
    一文搞懂Java的多线程底层逻辑,再也不怕多线程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 533,853
精华内容 213,541
关键字:

多线程的几个状态

友情链接: hhhhh.rar