5. 线程的状态、线程的阻塞的方式

Java中线程的状态分为6种

  1. 初始(NEW)状态:新创建了一个线程对象,但还没有调用start()方法。
  2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统称为“运行”。线程对象创建后其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权。此时处于就绪状态(ready)。就绪状态的线程在获得cpu时间片后变为运行中状态(running)
  3. 阻塞(BLOCKED):表示该线程阻塞于锁
  4. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或终端)
  5. 超时等待(TIME_WAITING):该状态不同于WAITING,它可以在指定的时间内自行返回
  6. 终止(TERMINATED):表示该线程已经执行完毕
  • 初始状态

    •   线程的实现有三种方式,一是继承Thread类,二是实现Runnable接口,三是实现Callable接口,但是不管如何,当我们new了这个对象之后,线程就进入了初始化状态。
  • 就绪状态
    •   线程被new出来,调用start()方法,此线程进入就绪状态
    • 当前线程sleep()方法结束,其他线程join()方法,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态
    • 当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态。
    • 锁池里的线程拿到对象锁后,进入就绪状态。
    • 该状态的线程位于“可运行线程池”中,变得可运行、只等待获取CPU的使用权,即在就绪状态的进程除CPU之外,其他的运行所需资源都已全部获得。
  • 运行中状态
    •   线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。
  • 阻塞状态
    •   阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。知道线程进入就绪状态,才有机会转到运行状态。
    • 阻塞的情况分三种
      •   等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒
      • 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。
      • 其他阻塞:运行的线程执行sleep()方法或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
  • 终止状态
    • 当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦终止了,就不能复生。

  状态图:

  

  当等待队列里有许多的线程都wait()在一个对象时,此时某一个线程调用了对象的notify()方法,那唤醒的到底是哪个线程?

  The choice is arbitrary and occurs at the discretion of the implementation.

参考文档:

http://ifeve.com/%E6%B3%A5%E7%93%A6%E5%8C%A0%E8%81%8A%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%9A%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%BF%85%E7%9F%A5%E5%BF%85%E4%BC%9A%EF%BC%88%E5%9F%BA%E7%A1%80/

https://blog.csdn.net/huakai_sun/article/details/78287931

https://blog.csdn.net/pange1991/article/details/53860651/

https://www.cnblogs.com/jijijiefang/articles/7222955.html

原文地址:https://www.cnblogs.com/GrimMjxCl/p/9307935.html

时间: 2024-10-29 19:07:07

5. 线程的状态、线程的阻塞的方式的相关文章

【学习总结】【多线程】 安全隐患 & 通讯 & 线程的状态

一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题 所以很自然的,当某个线程进入某个事件,处理某个事件,访问某个对象的时候,先加 “锁” 互斥锁的优缺点 优点:能有效防止因多线程抢夺资源造成的数据安全问题 缺点:需要消耗大量的CPU资源 互斥锁的使用前提:多条线程抢夺同一块资源 相关专业术语:线程同步,多条线程按顺序地执行任务 互斥锁,就

线程的状态

线程的状态 线程被创建时,属于新建状态,调用start后进入就绪状态 就绪状态被cpu调用时,进入运行状态 运行状态在调用sleep.wait.join后会进入阻塞状态 运行状态执行完成后会进入死亡状态,这里包括正常执行完毕和异常执行完毕 运行状态在os切换时,线程会进入就绪状态 线程wait进入阻塞状态,被调用notify之后,会进入就绪状态 线程sleep进入阻塞状态,时间过后会进入就绪状态 当前线程的子线程join之后,当前线程进入阻塞状态,在子线程死亡之后,当前线程进入就绪状态 阻塞状态

Linux之线程、线程控制、线程属性

一.整体大纲 二.线程相关 1. 什么是线程    LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下) 进程:独立地址空间,拥有PCB 线程:也有PCB,但没有独立的地址空间(共享) 区别:在于是否共享地址空间. 独居(进程):合租(线程). Linux下: 线程:最小的执行单位 进程:最小分配资源单位,可看成是只有一个线程的进程. 2. Linux内核线程实现原理     (1)线程实现原理 类Unix系统中,早期是没有“线程”概念的,80年代才

iOS开发多线程篇—线程的状态

iOS开发多线程篇—线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; 说明:创建线程有多种方式,这里不做过多的介绍. 线程的开启: [self.thread start]; 线程的运行和阻塞: (1)设置线程阻塞1,阻塞2秒 [NSThread sleepForTimeInterval:2.0]; (2)第二种设置线程阻塞2,以当前时

线程的状态与线程安全

线程也有生命周期,线程从创建到死亡会经历如下的过程: 创建(new)-->待运行(runnable)-->运行(running)-->死亡(dead) |_____阻塞______|(阻塞过程包含waiting.sleeping.yeild.join.blocked) 下面将一一讲诉具体的每个过程.前面讲到怎样创建一个线程,但创建完一个线程后此线程并不会马上进入到运行状态,而是要等分配到一定的资源(比如内存空 间)后变为runnable,当调用start()方法后,线程便开始运行.如果此

Java多线程学习之线程的状态及中断线程

线程的状态 新建(new):当线程被创建时,它只会短时间处于这种状态.它已经分配了必要的系统资源,完成了初始化.之后线程调度器将把这个线程转变为可运行或者阻塞状态: 就绪(Runnable):在这种状态下,只要调度器分配时间片给线程,线程就可以运行了: 阻塞(Blocked):有某个条件阻止线程运行,调度器将忽略阻塞状态的线程,不会分配时间片给它,直到线程进入就绪状态,它才有可能执行: 死亡(Dead):处于死亡或者终结状态的线程将不再是可调度的,并且也不会被分配到时间片.任务死亡的方式通常是从

Java多线程之线程的状态以及线程间协作通信导致的状态变换

一:线程的状态以及变化图 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态). New:新建状态,当线程创建完成时为新建状态,即new Thread(...),还没有调用start方法时,线程处于新建状态. Runnable:就绪状态,当调用线程的的start方法后,线程进入就绪状态,等待CPU资源.处于就绪状态的线程由Java运行时系统的线程调度程序(thread scheduler)来

iOS多线程技术—线程的状态

iOS多线程技术—线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; 说明:创建线程有多种方式,这里不做过多的介绍. 线程的开启: [self.thread start]; 线程的运行和阻塞: (1)设置线程阻塞1,阻塞2秒 [NSThread sleepForTimeInterval:2.0]; (2)第二种设置线程阻塞2,以当前时间

Java的多线程 --线程的状态

线程可以有6中状态. [1].New(新生) [2].Runnable(可运行) [3].Blocked(被阻塞) [4].Waiting(等待) [5].Timed Waiting(计时等待) [6].Terminated(被终止) 1.新生(New)线程: 当使用new 操作符创建一个先的线程,但该线程还没有调用start()方法.线程这个时候的状态就是新生,这个时候我们可以做些初始化之类的工作. 2.可运行(Runnable)线程: 一旦调用了start()方法,这个线程就处于可运行(Ru