专栏首页用户4352451的专栏线程和线程池的几个状态值

线程和线程池的几个状态值

线程的状态

  1. new 新建一个状态值但还未启动。
  2. Runable Ruanable 包括了操作系统的线程状态中的running和ready,也就是处于此状态底下的线程有可能正在运行或者正在等在CPU分配时间片。
  3. waitting 无线等待期: 处于这种情况下的线程不会被cpu分配时间片,他们要等待其他线程的显式唤醒才可以。
  • 没有设置timeOut 参数的Object.wait()方法。
  • 没有设置TimeOut参数的Thread.join()方法。
  • LockSupport.park()方法。
  1. Timed waiting 限期等待: 处于这种状态的线程也不会被分配时间片。但是他无需其他线程唤醒,在一定的时间之后他们会被分配CPU执行的时间
  • Thread.sleep
  • Object.wait()设置了TimeOut
  • Thread.join()设置了TimeOut
  • LockSupport.parkNanous()
  • LockSupport.parkUtil()
  1. blocked阻塞: 线程被阻塞了,阻塞状态和等待状态的区别在于,阻塞是在等待获取到一个排他锁而等待是在等待另一个线程的唤醒或者等待一段时间。这种一般会在使用sychronnized的时候会发生
  2. Terminated结束: 已终止线程的线程状态,线程已结束执行。 上面的描述了6种但是其中有两种都是等待所以说是5种状态值。但是runable 也有区分两种 running 和 ready。所以也可说是6种吧(但是在深入理解java虚拟机一书中有描述是5种)

线程池的状态

在java中线程池的实现的主类是通过ThreadPoolExcutor这个类来实现的, 线程池运行的状态,并不是用户显式设置的,而是伴随着线程池的运行,由内部来维护。线程池内部使用一个变量维护两个值:运行状态(runState)和线程数量 (workerCount)。在具体实现中,线程池将运行状态(runState)、线程数量 (workerCount)两个关键参数的维护放在了一起,如下代码所示

private static int runStateOf(int c)     { return c & ~CAPACITY; } //计算当前运行状态
private static int workerCountOf(int c)  { return c & CAPACITY; }  //计算当前线程数量
private static int ctlOf(int rs, int wc) { return rs | wc; }   //通过状态和线程数生成ctl

这篇文章主要说的是状态值所以说java线程池有一下几种状态值:

其生命周期转换如下入所示: 几种状态值的转换

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 秒懂Java并发和线程安全

    在平时写代码的时候我们经常会说“这会不会有线程安全问题,是不是得加把锁呢?”,细细的品一下这句话,是包涵很多知识点在里面。线程?,线程安全?,什么时候才会出现线...

    居士
  • springBoot 线程池异步编程

    2、基于注解进行参数的配置 在config包下,创建PayThreadPoolConfig.java配置类:

    居士
  • 浅析线程池参数设置

    首先先明确一下线程池的主要作用是什么 线程池解决的核心问题就是资源管理问题。在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入。...

    居士
  • 菜鸟的进阶之路:了解使用多线程

    关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,一般来说进程是独立的而同一进程中的线程是共享的,但是开一个...

    乱敲代码
  • 菜鸟的进阶之路:了解使用多线程

    关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,一般来说进程是独立的而同一进程中的线程是共享的,但是开一个...

    码农小胖哥
  • Java并发编程之线程封闭

    当访问共享变量时,往往需要加锁来保证数据同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程中访问数据,就不需要同步了。这种技术称为线程封闭。在Java语...

    技术训练营
  • Java线程池监控小结

    最近我们组杨青同学遇到一个使用线程池不当的问题:异步处理的线程池线程将主线程hang住了,分析代码发现是线程池的拒绝策略设置得不合理,设置为CallerRuns...

    阿杜
  • [051]Binder线程优先级继承

    Binder通信需要两个线程,这两个线程的优先级是不同,也就意味着,他们能获取到的cpu的优先级不同。

    王小二
  • dotnet 多线程禁止同时调用相同的方法 禁止方法重入调用 双检锁的设计

    大家在使用多线程的时候,是否有关注过线程安全的问题。如果咱的代码在使用多线程时,在相同的时间有多个线程同时执行相同的方法,此时也许就存在数据安全的问题,如多个线...

    林德熙
  • JAVA初级岗面试知识点——基础篇

    14、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?

    C you again 的博客

扫码关注云+社区

领取腾讯云代金券