线程状态及属性

线程一共有六种状态

  • New (新创建)
  • Runnable (可运行)
  • Blocked (被阻塞)
  • Waiting (等待)
  • Timed waiting (计时等待)
  • Terminated (被终止)

可以通过调用 getState 方法,获取一个线程的当前状态

New

基础且常用的创建线程的方式有两种:继承 Thread 类实现 Runnable 接口
这两种方法各有所长,不过不推荐使用继承 Thread 类的方法,因为:
Java单继承机制使得继承 Thread 类后无法再继承其他父类
继承方法不利于多线程之间共享资源
但是,继承 Thread 方法相较于实现 Runnable 方法的好处便于获取线程,实现 Runnable 必须通过调用静态方法 Thread.currentThread()来获取当前线程

//继承 Thread 类
class MyThread extends Thread {
    public void run(){
        //code
    }
} 

//实现 Runnable 接口
class MyThread implements Runnable {
    public void run(){
        //code
    }
}
//建议这样写
Runnable r = () -> {
    try{
        ...
        while (!Thread.currentThread().isInterrupted()){
            ...
        }
    }
    catch(InterruptedException e) {
        ...
    }
    finally {
        ...
    }
};
Thread t = new Thread(r);

Runnable

一个线程调用 start 方法后,就处于 runnable 状态
在任意时刻处于可运行的状态的线程,有可能在运行,也有可能没在运行,这就是为什么叫 可运行状态 而不是 运行状态
至于Runnable状态线程到底什么时候运行,这取决于操作系统的调度系统
有三种常见的调度方式:前后台式,抢占式,协作式
前后台式:严格按照前来后到的原则调度线程
抢占式:给每个线程分配时间片,当正在执行的线程的时间片用完后,立刻终止运行权,并按照优先级选择下一个线程,而且如果有一个比正在运行的线程优先级高线程可运行时,正在运行的线程立刻停止运行让出运行权
协作式:按照优先级调度线程,但是只有正在运行的线程主动停止运行时才会让出运行权

Blocked,Waiting

当线程处于 Blocked 或 Waiting 状态时, 它暂时不活动,也不运行任何代码而且消耗最少的资源,直到调度器重新激活它。
以下几种情况会导致线程进入非活动状态:

  • 当一个线程试图获取一个内部的对象锁,而该锁被其他线程持有,则线程进入 Blocked 状态,当所有其他线程释放该锁,并且线程调度器允许本线程持有它的时候才会变成 非阻塞状态
  • 当线程等待另一个线程通知调度器一个条件时,它自己进入 等待状态,在调用 Object.wait 方法或是 Thread.join 方法时,或是等待 java.util.concurrent 库中的 Lock 或 Condition 时,就会出现这种情况
  • 有几个方法有一个超时参数,调用它们导致线程进入 计时等待状态 ,这一状态将一直保持到超时期满或接受到适当的通知,带有超时参数的方法有 Thread.sleep,Object.wait,Thread.join,Lock.tryLock 及 Condition.await 的计时版

Terminated

以下两种原因会导致线程终止:
① run 方法正常退出的自然死亡
② 因为没有捕获异常而终止 run 方法的意外死亡

线程属性

线程属性包括:线程优先级,守护线程,线程组,处理未捕获异常的处理器

优先级

在 Java 中,每个线程都有一个优先级,默认情况下,一个线程继承它的父线程的优先级。可以用 setPriority 方法设置线程的优先级高低,优先级范围在 MIN_PRIORITY(Thread类中为 1)到 MAX_PRIORITY(10)之间
但是线程的优先级是高度依赖于系统的,在不同的平台下,优先级设置可能不同
如果确定要使用优先级,就一定要注意,在高优先级线程完成之前,低优先级线程永远不会运行,因此如果代码出错,或是调度有问题,低优先级线程可能会被饿死

守护线程

通过调用 t.setDaemon(true),可以将线程转换为守护线程。
守护线程唯一的用途是为其他线程提供服务,例如,计时线程
当只剩下守护线程时,虚拟机就退出了
守护线程永远不应该访问固有资源,如文件,数据库,因为它们可能随时退出,这会很危险

时间: 2024-10-14 14:56:19

线程状态及属性的相关文章

学习Java多线程之线程定义、状态和属性_java

一 .线程和进程 1. 什么是线程和进程的区别: 线程是指程序在执行过程中,能够执行程序代码的一个执行单元.在java语言中,线程有四种状态:运行 .就绪.挂起和结束. 进程是指一段正在执行的程序.而线程有事也被成为轻量级的进程,他得程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内功空间(代码段.数据段和堆空间)及一些进程级的资源(例如打开的文件),但是各个线程都拥有自己的棧空间. 2. 为何要使用多进程 在操作系统级别上来看主要有以下几个方面: - 使用多线程可以减少程序

《C#多线程编程实战(原书第2版)》——1.6 检测线程状态

1.6 检测线程状态 本节将描述一个线程可能会有哪些状态.获取线程是否已经启动或是否处于阻塞状态等相应信息是非常有用的.请注意由于线程是独立运行的,所以其状态可以在任何时候被改变. 1.6.1 准备工作 为了学习本节,你需要安装Visual Studio 2015.除此之外无需其他准备.本节的源代码放置在BookSamplesChapter1Recipe5目录中. 1.6.2 实现方式 请执行以下步骤来了解如何确定线程状态及获取线程相关的信息. 1.启动Visual Studio 2015.创建

服务器备份-bacula备份的内容无法恢复,sd线程状态显示如下

问题描述 bacula备份的内容无法恢复,sd线程状态显示如下 Device status: Device "FileStorage" (/tmp/backup) is not open. Used Volume status:

mysql processlist 线程状态(备查)

mysql processlist线程状态 今天遇见Creating sort index 忘了是什么状态,记录以备查. Analyzing 线程是对MyISAM 表的统计信息做分析(例如, ANALYZE TABLE ). checking permissions 线程是检查服务器是否具有所需的权限来执行该语句. Checking table 线程正在执行表检查操作. cleaning up 线程处理一个命令,并正准备以释放内存和重置某些状态变量. closing tables 线程是改变表中

Java线程状态

线程跟人类一样拥有自己的生命周期,一条线程从创建到执行完毕的过程即是线程的生命周期,此过程可能在不同时刻处于不同的状态,线程状态正是这小节的主题,线程到底有多少种状态?不同状态之间是如何转化的? 对于线程的状态的分类并没有严格的规定,只要能正确表示状态即可,如图2-5-7-1,先看其中一种状态分类,一个线程从创建到死亡可能会经历若干个状态,但在任意一个时间点线程只能处于其中一种状态,总共包含五个状态:新建(new).可运行(runnable).运行(running).非可运行(not runna

线程状态变迁

操作系统中线程/进程状态的变迁 图一 新的:刚创建一个新的线程还没执行相应的start方法. 就绪态:线程执行所需要的资源都已经满足了,就差CPU分配的时间片了 运行态:正在使用CPU时间片执行代码 等待:正在等待获取某些资源或某个事件的发生 终止:执行完程序 运行态-->就绪态:CPU分配的时间片到了,操作系统给出一个中断,对该线程进行上下文切换,使其进入就绪态. 就绪态-->运行态:拿到CPU时间,从PCB载入上次执行的信息,继续 运行程序 运行-->等待:正在运行的程序需要获取额外

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

线程的状态一共有6种,在任意时刻线程的状态只能是其中的一种.正确理解线程的状态有助于我们更容易理解线程.具体的线程状态如下: 状态名称 说明 NEW 初始状态,线程被构建,但是还没有调用start方法 RUNNING 运行状态 BLOCKED 阻塞状态,表示线程阻塞于锁 WAITING 等待状态,表示线程线程进入等待状态,进入该状态后需要其他线程做出通知动作 TIME_WAITING 超时等状态状态,该状态与WAITING不同,它是可以在指定时间内自行返回的 TERMINATED 终止状态,表示

如何使用jstack分析线程状态

背景 记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那又如何查看占用cpu较高的线程?   当然一个正常的程序员不会写出上述代码,这里只是为了让一个线程占用较高的cpu资源. top命令 在linux环境下,可以通过top命令查看各个进程的cpu使用情况,默认按cpu使用率排序   1.上图中可以看出pid为23344的java进程占用了较多的cpu资源:2.通过top -H

实例解析C++/CLI线程之线程状态持久性

其他形式的同步 我们可使用类Monitor与类Thread中的某些函数,直接控制线程的同步,请看例1. 例1: using namespace System; using namespace System::Threading; int main() { /*1*/ MessageBuffer^ m = gcnew MessageBuffer; /*2a*/ ProcessMessages^ pm = gcnew ProcessMessages(m); /*2b*/ Thread^ pmt =