Java并发编程系列之二:线程状态

线程的状态一共有6种,在任意时刻线程的状态只能是其中的一种。正确理解线程的状态有助于我们更容易理解线程。具体的线程状态如下:

状态名称 说明
NEW 初始状态,线程被构建,但是还没有调用start方法
RUNNING 运行状态
BLOCKED 阻塞状态,表示线程阻塞于锁
WAITING 等待状态,表示线程线程进入等待状态,进入该状态后需要其他线程做出通知动作
TIME_WAITING 超时等状态状态,该状态与WAITING不同,它是可以在指定时间内自行返回的
TERMINATED 终止状态,表示当前线程已经执行完毕

这六种状态是可以相互进行转化的,下面是具体的转化过程:

可以看到,线程创建之后,调用start()方法开始运行。当线程执行wait()方法之后,线程进入等待状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而超时等待状态相当于在等待状态基础上增加了时间的限制,就是说,超过了设定的时间限制就会返回到运行状态。当线程调用同步方法的时候,在没有获取到锁的情况下,线程会进入阻塞状态。线程在执行Runnable的run()方法之后会进入到终止状态。

时间: 2024-08-01 05:05:42

Java并发编程系列之二:线程状态的相关文章

浅谈Java并发编程系列(二)—— Java内存模型

物理计算机并发问题 在介绍Java内存模型之前,先简单了解下物理计算机中的并发问题.由于处理器的与存储设置的运算速度有几个数量级的差距,所以现代计算机加入一层读写速度尽可能接近处理器的高速缓存来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存中,这样处理器就无须等待缓慢的内存读写了. 基于高速缓存的存储交互引入一个新的问题:缓存一致性.在多处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主存,如图2-1所示 当多个处理器

Java并发编程系列之一:并发机制的底层原理

前言 并发编程的目的是让程序运行更快,但是使用并发并不定会使得程序运行更快,只有当程序的并发数量达到一定的量级的时候才能体现并发编程的优势.所以谈并发编程在高并发量的时候才有意义.虽然目前还没有开发过高并发量的程序,但是学习并发是为了更好理解一些分布式架构.那么当程序的并发量不高,比如是单线程的程序,单线程的执行效率反而比多线程更高.这又是为什么呢?熟悉操作系统的应该知道,CPU是通过给每个线程分配时间片的方式实现多线程的.这样,当CPU从一个任务切换到另一个任务的时候,会保存上一个任务的状态,

Java并发编程示例(十):线程组_java

对线程分组是Java并发API提供的一个有趣功能.我们可以将一组线程看成一个独立单元,并且可以随意操纵线程组中的线程对象.比如,可以控制一组线程来运行同样的任务,无需关心有多少线程还在运行,还可以使用一次中断调用中断所有线程的执行. Java提供了ThreadGroup类来控制一个线程组.一个线程组可以通过线程对象来创建,也可以由其他线程组来创建,生成一个树形结构的线程. 根据<Effective Java>的说明,不再建议使用ThreadGroup.建议使用Executor. --D瓜哥特此

Java并发编程系列之三:重排序与顺序一致性

前言 在我们编写程序并运行的时候,编译器给我们一个错觉:程序编译的顺序与编写的顺序是一致的.但是实际上,为了提高性能,编译器和处理器常常会对指令进行重排序.重排序主要分为两类:编译器优化的重排序.指令级别并行的重排序和内存系统的重排序.所以我们编写好Java源代码之后,会经过以上三个重排序,到最终的指令序列.我们这里提到的Java内存模型又是什么呢?Java内存模型(后面简称JMM)是语言级别的内存模型,主要用于控制一个共享变量的写入何时对另一个线程可见(后面所有方面都是围绕这点展开的).JMM

Java并发编程开发笔记——2线程安全性

在构建稳健的并发程序时,必须正确地使用线程和锁.但这些终归只是一些机制.要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问. "共享"意味着变量可以由多个线程同时访问,而"可变"则意味着变量的值在其生命周期内可以发生变化.我们将像讨论代码那样讨论线程安全性,但更侧重于如何防止在数据上发生不可控的并发访问. 一个对象是否需要是线程安全的,取决于它是否被多个线程访问.这指的是在程序中访问对象的方式

Java并发编程示例(一):线程的创建和执行_java

开门见山 在IT圈里,每当我们谈论并发时,必定会说起在一台计算机上同时运行的一系列线程.如果这台电脑上有多个处理器或者是一个多核处理器,那么这时是实实在在的"同时运行":但是,如果计算机只有一个单核处理器,那么这时的"同时运行"只是表象而已. 所有的现代操作系统全部支持任务的并发执行.你可以边听音乐,边上网看新闻,还不耽误首发电子邮件.我们可以说,这种并发是 进程级并发 .在进程内部,我也可以看到有许许多多的并发任务.我们把运行在一个进程里面的并发任务称 线程. 和

Java并发编程系列之五:happens-before原则

前言 happens-before是JMM的核心,之所以设计happens-before,主要出于以下两个方面的因素考虑的:1)程序员的角度,JMM内存模型需要易于理解.易于编程:2)编译器和处理器的角度,编译器和处理器希望内存模型对其束缚越少越好,这样就可以根据自己的处理规则进行优化.但是这两个方面其实是相互矛盾的,因为JMM易于编程和理解就意味着对编译器和处理器的束缚就越多. happens-before定义 基于上面的考虑,设计JMM时采用了一种折中的选择--JMM将需要禁止的重排序分为两

Java并发编程示例(三):线程中断_java

一个多线程的Java程序,直到所有线程执行完成,整个程序才会退出.(需要注意的是,是所有非后台线程(non-daemon thread)执行完成:如果一个线程执行了System.exit()方法,程序也会退出.)有时,你想中止一个线程的执行,例如你想退出程序,或者你想取消一个正在执行的任务等. Java提供了中断机制,可以让我们显式地中断我们想中止执行的线程.中断机制的一个特征就是我们可以检查线程是否已经被中断,进而决定是否响应中止请求.线程也可以忽略中止请求,继续执行. 在本节,我们所开发的示

Java并发编程系列之四:volatile和锁的内存语义

前言 在前面的文章中已经提到过volatile关键字的底层实现原理:处理器的LOCK指令会使得其他处理器将缓存刷新到内存中(确切说是主存)以及会把其他处理器的缓存设置为无效.这里的内存语义则说的是在JMM中的实现,那么为什么要理解volatile和锁在JMM中的内存语义呢?主要原因是这部分内容是与程序开发息息相关的,所以在高并发量的系统中,如果对这块知识的了解欠缺的话将无法设计出优雅支持高并发的系统(之前广被吐槽的12306,现在勉强能够支持千万级别的访问量了). volatile的内存语义 简