java基础线程知识
1. 开启线程
-
创建执行任务 Runnable
-
使用Thread创建线程, Thread构造函数传入 Runnable
-
调用start 开启线程
不要直接调用Thread的run方法,这不会开启线程应该调用start
new Thread(new Runnable() {
@Override
public void run() {
try{
/*
逻辑代码
*/
}
catch (InterruptedException e) {
}
}
}).start();
2. 中断线程
1. 当 run方法执行结束后,经由return 返回,线程自动停止
2. run方法出现未捕捉的异常
3. interrupt来主动请求终止线程
终端线程的场景:
当线程运行中,某些条件下需要终止线程,这时候需要不运行线程或者终止线程
本质上interrupt就是把一个标志位置位然后有函数可以在线程内部检查这个标志位
-
主动调用线程的interrupt方法来置位标志位
-
Thread.currentThread().isInterrupted()检测标志位是否被置位
-
当线程处于sleep的时候,被interrupt终端,将会抛出InterruptedException异常,标志位清除
-
当线程处于interrupt状态,进行sleep调用会将会抛出InterruptedException异常,并且中断标志位会被清除
如果程序中循环调用sleep就不需要 手动检测 标志位,只需要捕获InterruptedException异常就好了
- Thread.currentThread().isInterrupted() 和Thread.interrupted() 区别是前者仅仅检查标志位是否被置位后者 检查的同时会把标志位清空
3. 线程状态
线程有如下几个状态: New Runnable Block wait Timing wait Terminated
-
New 状态就是 Thread被创建出来
-
Runnable状态,代表可运行线程,注意这种状态下线程可能运行也可能没在运行,因为线程调度可能没给这个线程时间片让他运行
-
Block状态,当一个线程试图获取内部的对象锁,这个锁被其他线程持有,线程进入阻塞状态
当所有线程释放这个锁,并且线程调度器允许本线程持有他,该线程编程非阻塞状态
-
wait状态,当一个线程等待另一个线程通知调度器一个条件时,该线程进入等待状态
-
Timing wait状态
保持收到解除 状态或者 时间到达的时候,线程解除状态
Thread.sleep Thread.join Lock.tryLock Condition.await的计时版本
- Terminated状态
没有捕获异常
run方法自然结束
-
当一个线程被重新激活(时间到了或者拿到锁了),调度器检查它是否比当前允许线程有更高的优先级权限,如果有让线程停止,激活线程开始运行
4. 线程属性
- 线程优先级
java语言中线程的优先级默认继承自父类
但是注意的是 确定你要更改线程的优先级,因为很可能线程调度器会一直 选择 高优先级的几个线程,让低优先级的线程饿死
-
守护线程
和linux守护进程一样,一直在后台为其他线程提供服务使用,比如计时线程
-
未捕获的异常处理器
在run方法中抛出非受查异常将导致线程停止,不需要任何catch语句来处理传播异常,在线程死亡之前这个异常会被处理到未捕获异常的处理器中
使用setUncaughtExceptionHandler方法为线程安装一个处理器,也可以使用Thread类的静态方法setDefaultUncaughtException为所有线程安装默认处理器

浙公网安备 33010602011771号