Thread源码解读
线程的关键属性
1 | // 线程名称 |
线程的状态以及流转方式
线程的状态主要有以下几种:
NEW
这个状态表示线程已经创建但尚未启动。线程在创建后,调用start()方法之前处于这个状态。
RUNNABLE
这个状态表示线程正在运行或准备运行,并且正在等待系统分配资源。
BLOCKED
这个状态表示线程正在等待监视器锁以进入或重新进入一个同步块/方法。这个状态表示线程被阻塞并等待另一个线程释放锁。
有两种情况会进入这个状态:
- 当一个线程试图进入一个synchronized块,而该块的锁已经被其他线程持有。
- 当一个线程在一个对象上调用wait方法后,另一个线程调用了该对象的notify或notifyAll方法,但是原线程无法立即获取到该对象的锁。
WAITING
这个状态表示线程正在无限期地等待另一个线程执行特定的操作。当线程调用如Object.wait()(无超时)、Thread.join()(无超时)或LockSupport.park()等方法时,会进入这个状态。
TIMED_WAITING
这个状态表示线程正在等待另一个线程执行操作,但最多等待指定的时间。当线程调用如Thread.sleep()、Object.wait(long timeout)、Thread.join(long millis)、LockSupport.parkNanos()或LockSupport.parkUntil()等方法时,会进入这个状态。
TERMINATED
这个状态表示线程已经完成其执行并且不再活动。
流转过程可以参考这个图:
线程的构造器
1 | // 构造一个默认熟悉感的线程 |
这些构造器底层都会调用一个私有构造器去初始化线程:
1 | private Thread(ThreadGroup g, Runnable target, String name, |
线程的创建方式
继承Thread类:创建一个新的类,该类继承自Thread类,然后重写Thread类的run()方法。然后可以创建该类的实例,并调用其start()方法来启动新线程。
实现Runnable接口:创建一个新的类,该类实现Runnable接口,然后实现Runnable接口的run()方法。然后可以创建该类的实例,并将其作为参数传递给Thread类的构造函数,然后调用Thread对象的start()方法来启动新线程.
总的来说,实现Runnable接口的方式更为常用,因为它允许你的类可以继承其他类。
线程的关键方法
start()
用于启动一个线程,同一个线程只能调用一次start(),否则会抛出IllegalThreadStateException异常
1 | public synchronized void start() { |
中断操作
interrupt()
线程的中断操作是一种通知机制,用于告诉线程应该停止当前的工作并做其他事情。
1 | public void interrupt() { |
interrupted()
用于检查当前线程是否已被中断,并清除中断状态。
1 | public static boolean interrupted() { |
一个关于中断操作的小demo
1 | public static void main(String[] args) { |
join
Thread类的join方法用于使当前线程等待,直到调用join方法的线程结束为止。这个方法可以用于确保一个线程在另一个线程完成其工作后再开始执行
join方法有三种形式:
void join() throws InterruptedException: 这个方法会使当前线程无限期等待,直到调用join方法的线程结束。
void join(long millis) throws InterruptedException: 这个方法会使当前线程等待指定的毫秒数,或者直到调用join方法的线程结束,以先到者为准。
void join(long millis, int nanos) throws InterruptedException: 这个方法会使当前线程等待指定的毫秒数和纳秒数,或者直到调用join方法的线程结束,以先到者为准。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public final synchronized void join(final long millis)
throws InterruptedException {
if (millis > 0) {
if (isAlive()) {
final long startTime = System.nanoTime();
long delay = millis;
do {
// 调用的wait方法,使当前线程处于等待
wait(delay);
} while (isAlive() && (delay = millis -
TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime)) > 0);
}
} else if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
throw new IllegalArgumentException("timeout value is negative");
}
}
join的小例子
在这个例子中,thread1内部调用了thread的join方法,意味着它会在thread线程执行完毕后再执行
1 | public static void main(String[] args) { |
结果为:
Thread is finished
Thread 1 is waiting for thread to finish