java并发编程之线程状态

java线程中,线程状态是如何转换的呢?这一次我们一起来学习下。

线程状态:

NEW:

线程创建之后,还没有启动。这时候它的状态就是NEW

RUNNABLE:

正在Java虚拟机下跑任务的线程的状态。在RUNNABLE状态下的线程可能会处于等待状态, 因为它正在等待cpu的时间片。

BLOCKED:

线程处在阻塞状态,共分几种情况,

同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。

当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。sleep方法不释放持有的锁

WAITING:

等待状态,wait方法进入,无限期等待,等待其它线程显式地唤醒,否则不会被分配 CPU 时间片。

进入原因:

1.没有超时timeout参数的Object.wait()

2.没有超时timeout参数的Thread.join()

3.LockSupport.park()

TIMED_WAITING:

超时等待状态,无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒。

1.Thread.sleep()方法

2.设置了超时timeout参数的Object.wait()方法

3.设置了超时timeout参数的Thread.join()方法

4.LockSupport.parkNanos()方法

5.LockSupport.parkUntil()方法

TERMINATED:

线程中止的状态,这个线程已经完整地执行了它的任务。

“阻塞”与“等待”的区别:

(1)“阻塞”状态是等待着获取到一个排他锁或资源(如IO输入等),进入“阻塞”状态都是被动的,离开“阻塞”状态是因为其它线程释放了锁;

(2)“等待”状态是在等待一段时间 或者 唤醒动作的发生,进入“等待”状态是主动的。

如下图所示,各种状态的转换关系如下

《Java多线程编程核心技术》图片

Java线程调度:

协同式:

线程的执行时间由线程本身来控制,线程把自己的工作执行完了之后,要主动通知系统切换到另外一个线程上。

抢占式:

每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定,Java采用这种方式调度,但我们可以"建议"操作系统,给予都些重要的线程更多的执行时间。如何做呢?就是通过“线程优先级”

线程优先级

java的线程Thread类中,有几个常量定义优先级,

static int MAX_PRIORITY

线程可以具有的最高优先级10。

static int MIN_PRIORITY

线程可以具有的最低优先级1。

static int NORM_PRIORITY

分配给线程的默认优先级5。

而实际优先级为1-10,但使用除上面之外的其他优先级需要关注,对应操作系统可能与对应优先级别,建议使用上面三个。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200105A02XSG00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券