java 线程状态转换图解

java线程状态转换图

java线程运行过程中的各个状态的转换如下图:

  1. 实例化后New

  2. New-->RUNNABLE

    Thread.start() ==>系统调度

    ​ running—>ready <==Thread.yield

    ​ ready-->running

  3. RUNNABLE-->WAITING Object.wait() Thread.join() LockSupport.park()

  4. RUNNABLE-->TIME_WAITING Object.wait(long) Thread.sleep(long) Thread.join(long) LockSupport.parkNanos() LockSupport.parkUntil()

  5. RUNNABLE-->BLOCKED 等待进入synchronized方法 等待进入synchronized块

  6. RUNNABLE-->TERMINATED

  7. WAITING-->RUNNABLE Object.notify() Object.notifyAll() LockSupport.unpark(Thread)

  8. TIME_WAITING-->RUNNABLE Object.notify() Object.notifyAll() LockSupport.unpark(Thread)

  9. BLOCK-->RUNNABLE

yield

  1. 暂停当前正在执行的线程对象。
  2. yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
  3. yield()只能使同优先级或更高优先级的线程有执行的机会。
  4. yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
2021-11-07 15:49

Java并发编程

java_线程

进程与线程的区别

线程的状态

NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为&amp;amp;ldquo;运行状态&amp;amp;rdquo; BLOCK:阻塞状态,表示线程阻塞于锁 WAITING:等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或者等待) TIME_WAITING:超时等待状态,可以在等待的时间自行返回的 TERMINATED:终止状态,表示当前线程已经执行完毕

  • NEW:初始状态

    NEW:初始状态,线程被构建,但是还没有调用start()方法

  • RUNNABLE:运行状态

    RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为&amp;amp;ldquo;运行状态&amp;amp;rdquo;

  • BLOCK:阻塞状态

    BLOCK:阻塞状态,表示线程阻塞于锁

  • WAITING:等待状态

    WAITING:等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或者等待)

  • TIME_WAITING:超时等待状态

    TIME_WAITING:超时等待状态,可以在等待的时间自行返回的

  • TERMINATED:终止状态

    TERMINATED:终止状态,表示当前线程已经执行完毕

  • Java线程状态切换

    Java并发核心知识

    并发编程需要解决的两大问题

  • 线程之间如何通信
  • 线程通信机制
  • 内存共享
  • 消息传递
  • 线程之间如何同步

    同步是指程序中用于控制不同线间操作发生相对顺序的机制

  • Java内存模型(JMM)

  • 重排序

    为了程序的性能,处理器、编译器都会对程序进行重排序处理

  • 顺序一致性

  • happens-before

  • as-if-serial

    所有的操作均可以为了优化而被重排序,但是你必须要保证重排序后执行的结果不能被改变

  • volatile

    synchronized

    队列同步器AQS

    CAS

    Compare And Swap,整个JUC体系最核心、最基础理论

    ThreadLocal

    ThreadLocal 不是用于解决共享变量的问题的,也不是为了协调线程同步而存在,而是为了方便每个线程处理自己的状态而引入的一个机制。

    为每一个线程创建一个单独的变量副本,从而每个线程都可以独立地改变自己所拥有的变量副本,而不会影响其他线程所对应的副本

  • ThreadLocalMap
  • _java_并发容器(集合)

    ConcurrentHashMap

    CAS + Synchronized 来保证并发更新的安全,底层采用数组+链表/红黑树的存储结构

    ConcurrentLinkedQueue

    基于链接节点的无边界的线程安全队列,采用FIFO原则对元素进行排序,内部采用CAS算法实现

    ConcurrentSkipListMap

    ConcurrentSkipListSet

    java_锁

    Lock接口

    ReentrantLock(重入锁)

    _ReentrantReadWriteLock(读写锁)

    LockSupport

    Condition接口

    Java阻塞队列

    阻塞队列类(7个)

  • ArrayBlockingQueue

    一个由数组组成的有界阻塞队列

  • LinkedBlockingQueue

    一个由链表组成的有界阻塞队列

  • _LinkedBlockingDeque

    一个由链表组成的双向阻塞队列

  • PriorityBlockingQueue

    一个支持优先级排序的无界阻塞队列

  • DelayQueue

    一个使用优先级队列实现的无界阻塞队列

  • SynchronousQueue

    一个不存储元素的阻塞队列

  • LinkedTransferQueue

    一个由链表组成的无界阻塞队列

    即可以像其他的BlockingQueue一样有容量又可以像SynchronousQueue一样不会锁住整个队列

  • java_并发工具

    CountDownLatch

    CyclicBarrier

    Semaphore

    Exchanger

    java_原子操作类Atomic

    基本类型类

    用于通过原子的方式更新基本类型

  • AtomicBoolean
  • AtomicInteger
  • AtomicLong
  • 数组

    通过原子的方式更新数组里的某个元素

  • AtomicIntegerArray

    原子更新整型数组里的元素

  • AtomicLongArray

    原子更新长整型数组里的元素

  • AtomicReferenceArray

    原子更新引用类型数组里的元素

  • 引用

    如果要原子的更新多个变量,就需要使用这个原子更新引用类型提供的类

  • AtomicReference

    原子更新引用类型

  • AtomicReferenceFieldUpdater

    原子更新引用类型里的字段

  • AtomicMarkableReference

    原子更新带有标记位的引用类型

  • 属性

    如果我们只需要某个类里的某个字段,那么就需要使用原子更新字段类

  • AtomicIntegerFieldUpdater

    原子更新整型的字段的更新器

  • AtomicLongFieldUpdater

    原子更新长整型字段的更新器

  • AtomicStampedReference

    原子更新带有版本号的引用类型

  • java并发框架

    Fork/Join框架

    一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架

    Executor框架

  • Executors

    静态工厂类,提供了Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 、Callable 等类的静态工厂方法

  • ThreadPoolExecutor(线程池)

  • 线程池分类
  • FixedThreadPool
  • CachedThreadPool
  • SingleThreadExecutor
  • ScheduledThreadPoolExecutor

    继承自ThreadPoolExecutor,给定的延迟之后运行任务,或者定期执行任务

  • Future

    定义了取消任务,查询任务是否完成,获取任务的执行结果

  • FutureTask

    实现RunnableFuture接口,既可以作为Runnable被执行,也可以作为Future得到Callable的返回值。内部基于AQS实现

  • 相关教程

    更多

    java线程状态详解(6种)

    java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

    Java 多线程编程

    Java 多线程编程     Java给多线程编程提供了内置的支持。一个多线程程序包含两个或多个能并发运行的部分。程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径。 多线程是多任务的一种特别的形式。多线程比多任务需要更小的开销。 这里定义和线程相关的另一个术语:进程:一个

    请教多线程JAVA问题

    需求:  命令队列(存放n个命令,ip 端口 命令ID等信息),通过多线程scoket(线程数是20个).从命令队列里面取出 命令,解析执行。  连接的服务器,连接数是有限制的最大2个连接。所以scoket 必须维持长连接  最多可以有20个线程 连接20个不同IP的机器。但机器是N个。  问题1 怎么在多线程中维持长连接发送 接收数据,相同IP的命令发送接收完后需要断开连接。     问题补充:

    Java 简介

    Java 简介  Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。 Java分为三个体系:    JavaSE(J2SE)(Java2 Platform

    Java 异常处理

    Java 异常处理    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。  比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.

    JAVA WEB

    我也搞了几年JAVA了,由于一向懒惰,没有成为大牛,只是一普通程序猿,不爱玩社交网站,不爱玩微博,唯独喜欢百度贴吧,潜水很久了,手痒来给新人分享下从新手成长为老鸟的已见,也刷刷存在感,应该不比曝照差吧。首先初识语法的阶段,必须要学会怎么操作对象,操作if和for,操作list set map,然后是线程、IO和jdbc什么的,其余的,若是一时不理解,可以后边需要时再学。这阶段完了,你可以写些能在控

    Java基础

    理解计算机中数据的存储和运算机制。而且,在JDK7以后,java提供的很多 源代码底层都用到位运算符,通过这次课程的学习,我们可以去读懂JDK的源码, 让我们更好的理解我们所学知识...

    java WHILE 循环问题

    有没有办法让循环在5秒以后自动退出?     问题补充:     clshanghe 写道      利用线程就可以啊    能给个实例代码么?      问题补充:   DatagramPacket p = new DatagramPacket(datas,datas.length);while(true){    dgs.receive(p);    System.out.println(p)

    求推荐JAVA 多线程编程书籍

    求推荐JAVA 多线程编程书籍

    JAVA设计模式学习23——状态模式

    状态(state)模式:状态模式的意图是,允许一个对象在其内部状改变时改变它的行为。看起来就像是改变了它的类一样。     主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。          状态模式的结构如下图:                从图中可以看出状态模式有以下角色:          1、抽象状

    Callable接口实现Java多线程

    Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。Callable和Runnable有几点不同:(1)Callable规定的方法是call(),而Runnable规定的方法是run().(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。 (3)call()方法可抛出异常,而run()方法是不能抛出异常的.(4)运行Callable任务可拿到一个Future对象...

    关于线程

    线程,学了挺久了。我发现我不会写总结这种东西。 好吧,我又词穷了。不知道该怎么写了。先打开eclipse看看。先说说我对线程的理解把。 我觉得线程就是好几条流水线在一起工作,能提高工作效率和空间利用率。就像一个工厂,如果只用一条流水线,那每天生产的鞋子估计少得可怜,利润应该也不怎么样,这样的工厂应该关门了。但是如果一个工厂有好多条流水线,同时生产好多鞋子,那就可以挣好多钱,可以在这个行业有很强的竞

    一步一步掌握java的线程机制(一)----创建线程

    现在将1年前写的有关线程的文章再重新看了一遍,发现过去的自己还是照本宣科,毕竟是刚学java的人,就想将java的精髓之一---线程进制掌握到手,还是有点难度。等到自己已经是编程一年级生了,还是无法将线程这个高级的概念完全贯通,所以,现在趁着自己还在校,尽量的掌握多点有关线程机制的知识。 我们以一个简单的例子开始下手:      public class SwingTypeTester exten

    Java Applet基础

    Java Applet基础    applet是一种Java程序。它一般运行在支持Java的Web浏览器内。因为它有完整的Java API支持,所以applet是一个全功能的Java应用程序。 如下所示是独立的Java应用程序和applet程序之间重要的不同:      Java中applet类

    Java对象和类

    Java对象和类    Java作为一种面向对象语言。支持以下基本概念:      多态  继承  封装  抽象  类  对象  实例  方法  消息解析    本节我们重点研究对象和类的概念。      对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种

    最新教程

    更多

    java线程状态详解(6种)

    java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

    redis从库只读设置-redis集群管理

    默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

    Netty环境配置

    netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

    Netty基于流的传输处理

    ​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器不是分组的队列,而是字节的队列。 这意味着,即使将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一组字节(有点悲剧)。 因此,不能保证读的是您在远程定入的行数据

    Netty入门实例-使用POJO代替ByteBuf

    使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

    Netty入门实例-时间服务器

    Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

    Netty入门实例-编写服务器端程序

    channelRead()处理程序方法实现如下

    Netty开发环境配置

    最新版本的Netty 4.x和JDK 1.6及更高版本

    电商平台数据库设计

    电商平台数据库表设计:商品分类表、商品信息表、品牌表、商品属性表、商品属性扩展表、规格表、规格扩展表

    HttpClient 上传文件

    我们使用MultipartEntityBuilder创建一个HttpEntity。 当创建构建器时,添加一个二进制体 - 包含将要上传的文件以及一个文本正文。 接下来,使用RequestBuilder创建一个HTTP请求,并分配先前创建的HttpEntity。

    MongoDB常用命令

    查看当前使用的数据库    > db    test  切换数据库   > use foobar    switched to db foobar  插入文档    > post={"title":"领悟书生","content":"这是一个分享教程的网站","date":new

    快速了解MongoDB【基本概念与体系结构】

    什么是MongoDB MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

    windows系统安装MongoDB

    安装 下载MongoDB的安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,按照提示步骤安装即可。 安装完成后,软件会安装在C:\Program Files\MongoDB 目录中 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我

    Spring boot整合MyBatis-Plus 之二:增删改查

    基于上一篇springboot整合MyBatis-Plus之后,实现简单的增删改查 创建实体类 添加表注解TableName和主键注解TableId import com.baomidou.mybatisplus.annotations.TableId;
    import com.baomidou.mybatisplus.annotations.TableName;
    import com.baom

    分布式ID生成器【snowflake雪花算法】

    基于snowflake雪花算法分布式ID生成器 snowflake雪花算法分布式ID生成器几大特点: 41bit的时间戳可以支持该算法使用到2082年 10bit的工作机器id可以支持1024台机器 序列号支持1毫秒产生4096个自增序列id 整体上按照时间自增排序 整个分布式系统内不会产生ID碰撞 每秒能够产生26万ID左右 Twitter的 Snowflake分布式ID生成器的JAVA实现方案