1.什么是线程?
现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。
2. 线程的状态
线程在自身的生命周期中,并不是固定地处于某个状态,而是随着代码的执行在不同的状态之间进行切换
线程创建之后,调用start()方法开始运行。当线程执行wait()方法之后,线程进入等待状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而超时等待状态相当于在等待状态的基础上增加了超时限制,也就是超时时间到达时将会返回到运行状态。当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到阻塞状态。线程在执行Runnable的run()方法之后将会进入到终止状态。
3.启动和终止线程
通过调用线程的start()方法进行启动,随着run()方法的执行完毕,线程也随之终止
构造线程:在运行线程之前首先要构造一个线程对象,线程对象在构造的时候需要提供线程所需要
抛出
的属性,如线程所属的线程组、线程优先级、是否是Daemon线程等信息。
启动线程:线程对象在初始化完成之后,调用start()方法就可以启动这个线程。线程start()方法的
含义是:当前线程同步告知Java虚拟机,只要线程规划器空闲,应立即启动调用start()方法的线
程。
4.中断
中断的定义
中断是线程的一个标识位属性,用于指示一个运行中的线程是否被其他线程执行了中断操作。可以将其形象地理解为其他线程向该线程发出的一个 “信号”,并非直接强制终止线程。
中断操作
其他线程可通过调用目标线程的 interrupt()
方法来对其进行中断操作。
线程对中断的响应
线程可通过以下两种方式检查自身是否被中断并做出响应:
isInterrupted()
方法:这是一个实例方法,用于判断线程是否被中断,调用该方法不会改变线程的中断标识位。Thread.interrupted()
方法:这是一个静态方法,用于检查当前线程的中断标识位,并在检查后将中断标识位复位(即设置为false
)。
终结状态线程的中断情况
若线程已处于终结状态(如 run()
方法执行完毕),即便该线程在终结前被中断过,调用该线程对象的 isInterrupted()
方法时仍会返回 false
。
抛出 InterruptedException
方法与中断标识位的关系
Java API 中许多声明抛出 InterruptedException
的方法(如 Thread.sleep(long millis)
),在抛出该异常之前,Java 虚拟机会先清除线程的中断标识位,然后再抛出 InterruptedException
。此时调用 isInterrupted()
方法会返回 false
。