一、线程的基本状态

线程基本上有5种状态,分别是:NEW、Runnable、Running、Blocked、Dead。

1)新建状态(New)

当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();

2)就绪状态(Runnable)

当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;

3)运行状态(Running)

当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就     绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

4)阻塞状态(Blocked)

处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:

1、等待阻塞

运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;

2、同步阻塞

线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;

3、其他阻塞

通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5)死亡状态(Dead)

线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

用一张图来将其概括的话会更容易记忆:

二、线程的生命周期

而一个线程的声明周期一般从新建状态(New)开始,到死亡状态(Dead)结束,中间可以存在许多中可能。

如上图所示,一般情况下会有4个分支情况。

1)正常情况

如上图中红色箭头所示,正常状态下线程的声明周期是这样的:NEW -> RUNNABLE -> RUNNING -> DEAD。

分别是正常情况(红色箭头),发生锁阻塞(同步阻塞)的情况(蓝色箭头),发生等待阻塞的情况(黄色箭头),发生其他阻塞的情况(黑色箭头),分别对应上图4个不同颜色的流向。

2)发生锁阻塞(同步阻塞)

如上图中蓝色箭头所示,当线程进入 RUNNING 状态时进入了 synchronized 方法块,这时就会发生锁阻塞,线程进入一个 Lock Pool 锁池中。当其获得锁之后,又进入到可运行状态。当CPU分片轮询到它的时候,它就再次运行,直至 DEAD 状态。

3)发生等待阻塞

如上图中蓝色箭头所示,当线程进入 RUNNING 状态时遇到了 wait() 方法,这时就会发生等待阻塞,它会等待其他线程调用 notify() 方法释放锁之后才可恢复到可运行状态。当CPU分片轮询到它的时候,它就再次运行,直至 DEAD 状态。等待阻塞和锁阻塞其实是同一类型的,都是因为争夺锁而发生的线程等待,唯一的不同是因为它们调用的是不同的方式实现,但底层原理相同。要注意的是执行 wait() 方法的时候,线程一定要获得锁,所以 wait() 方法一般都在 synchronized 方法或代码块中。当其获得锁之后进入等待池(wait pool)并释放锁。收到 notify() 通知之后等待获取锁,获取锁之后才可以运行。

4)发生其他阻塞(如:IO读取等)

当线程需要去读取文件,而此时文件又被其他线程占用,那么就会发生阻塞。这时候线程需要等待其他线程读取完之后才能继续进行,这可以称为 IO 阻塞。当然了还有很多种情况,如网络阻塞等等。

 

参考文章:

http://www.cnblogs.com/lwbqqyumidi/p/3804883.html 

http://www.cnblogs.com/mengdd/archive/2013/02/20/2917966.html

Java并发编程:线程的基本状态的更多相关文章

  1. Java 并发编程 | 线程池详解

    原文: https://chenmingyu.top/concurrent-threadpool/ 线程池 线程池用来处理异步任务或者并发执行的任务 优点: 重复利用已创建的线程,减少创建和销毁线程造 ...

  2. java并发编程 线程基础

    java并发编程 线程基础 1. java中的多线程 java是天生多线程的,可以通过启动一个main方法,查看main方法启动的同时有多少线程同时启动 public class OnlyMain { ...

  3. java并发编程 | 线程详解

    个人网站:https://chenmingyu.top/concurrent-thread/ 进程与线程 进程:操作系统在运行一个程序的时候就会为其创建一个进程(比如一个java程序),进程是资源分配 ...

  4. Java并发编程:线程间通信wait、notify

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  5. Java并发编程:线程和进程的创建(转)

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...

  6. Java并发编程-线程可见性&线程封闭&指令重排序

    一.指令重排序 例子如下: public class Visibility1 { public static boolean ready; public static int number; } pu ...

  7. Java并发编程——线程池的使用

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...

  8. Java并发编程--线程池

    1.ThreadPoolExecutor类 java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,下面我们来看一下ThreadPoolExecuto ...

  9. Java并发编程——线程池

    本文的目录大纲: 一.Java中的ThreadPoolExecutor类 二.深入剖析线程池实现原理 三.使用示例 四.如何合理配置线程池的大小 一.Java中的ThreadPoolExecutor类 ...

  10. java并发编程 线程间协作

    线程间协作 1. 等待和通知 等待和通知的标准形式 等待方: 获取对象锁 循环中判断条件是否满足,不调用wait()方法 条件满足执行业务逻辑 通知方: 获取对象所 改变条件 通知所有等待在对象的线程 ...

随机推荐

  1. 几分钟看完 flow.ci 全部功能

    从 0 到 1,从邀请式内测到收费上线,flow.ci 经历了十个多月的沉淀与打磨.这期间,flow.ci 工程师们奋力赶工,进行了一系列的大功能更新,Bug 修复,功能优化. 这篇文章记录了 flo ...

  2. JSP中三种弹出对话框的用法《转》

    对话框有三种 1:只是提醒,不能对脚本产生任何改变: 2:一般用于确认,返回 true 或者 false ,所以可以轻松用于 if...else...判断 3: 一个带输入的对话框,可以返回用户填入的 ...

  3. 使用咪咕云做C站视频直链源

    首先我们先百度搜索一下“咪咕云” 点击进入-->用户注册或登录 注册时选择个人用户-->前往邮箱激活-->进入邮箱激活成功后重新登录 登录后在控制台选择“云点播” 即可进行上传视频了 ...

  4. 用DapperExtensions和反射来实现一个通用搜索

    前言 搜索功能是一个很常用的功能,当然这个搜索不是指全文检索,是指网站的后台管理系统或ERP系统列表的搜索功能.常见做法一般就是在搜索栏上加上几个常用字段来搜索.代码可能一般这样实现 StringBu ...

  5. JQuery实现Ajax跨域访问--Jsonp原理

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于Java ...

  6. jquery 的基础知识,以及和Javascript的区别

    想到之前所学的javascript 我们会想到这几个方面:找元素: 操作内容: 操作属性:操作样式:统一操作元素: jquery 也是从这几个方面来学习的. <head> <meta ...

  7. Gradle之恋-任务1

    任务作为Gradle的核心功能模块,而且Gradle的任务还可以具有自己的属性和方法,大大扩展了Ant任务的功能.由于任务相关内容比较多,分为两篇来探讨,本篇主要涉及到:任务的定义.任务的属性.任务的 ...

  8. li点击弹出序号

    <body> <ul> <li>test1</li> <li>test2</li> <li>test3</li ...

  9. 服务器数据库搭建流程(CentOs+mysql)

    前言: 服务器上数据库搭建需要知道Linux系统的版本,以前的Ubuntu14.04直接在终端下输入apt-get install (package)便可方便的下载并安装mysql,但是在centOs ...

  10. [LintCode]快速幂(数论)

    计算a^n % b,其中a,b和n都是32位的整数. 快速幂搞就过了.快速幂首先就是要知道 (a*b)%c = ((a%c)*b)%c ,所以经过推导得出. (a^n)%b = ((((a%b)*a) ...