1. 常用方法
1.1 start & run
start :
让任务处于就绪状态。
cpu有时间片来运行这个线程,那么就会开始运行
run:
线程需要运行的任务具体内容
1.2 sleep & yield
sleep:
- 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)
- 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException
- 睡眠结束后的线程未必会立刻得到执行
- 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性
yield:
- 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程
- 具体的实现依赖于操作系统的任务调度器
- 用于调试
注:区别:yield是进入就绪状态 一旦cpu没有其他线程任务 则会马上执行yield的代码
1.3 thread.setPriority()
设置线程优先级
1.线程优先级会提示(hint)调度器优先调度该线程,但它仅仅是一个提示,调度器可以忽略它
2.如果 cpu 比较忙,那么优先级高的线程会获得更多的时间片,但 cpu 闲时,优先级几乎没作用
1.4 join
joinThread.join()
使用join的方法所在的线程,要等待joinThread执行完run方法 才能执行
join(n)
最多等 n 毫秒 之后不再等待
1.5 interrupt 打断
1.5.1 打断 sleep,wait,join 的线程
这几个方法都会让线程进入阻塞状态 thread.interrupt 将isInterrupted这个状态转成true
打断 sleep 的线程, 会清空打断状态,
interrupt只是会给线程增加一个打断标记,让线程内部知道有别人在打断他,但是不会影响他的运行
在线程内部我们可以通过Thread.currentThread().isInterrupted();
知道自己是否有被打断 可以理解成线程之间发信号的一种方式

1.5.2 两阶段终止模式
作用:避开终止任务,让任务干到一般停了。让线程干完活,再停止。(重要任务:释放锁)
类似于操作系统kill的方法 会直接杀死 让在执行的任务,如:支付之类的 半途终止,发生很恐怖的问题。

注意:方法interrupted和isInterrupt
interrupted会在使用之后,清除打断标记 使他回复false
1.5.3 LockSupport.park
同样也能让任务停下来 ,但是专门为了和isInterrupt/interrupted配合
park之后 interrupt可以让线程继续运行
注意:如果线程处于isInterrupt=true状态 park无法停止

1.6 不推荐使用方法

1.7 守护线程
默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守
护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束
就是辅助其他大哥的小弟线程,大哥倒了,小弟只能开溜。
log.debug("开始运行...");
Thread t1 = new Thread(() -> {
log.debug("开始运行...");
sleep(2);
while(true){
}
log.debug("运行结束...");
}, "daemon");
// 设置该线程为守护线程
t1.setDaemon(true);
t1.start();
sleep(1);
log.debug("运行结束...");
输出:
08:26:38.123 [main] c.TestDaemon - 开始运行...
08:26:38.213 [daemon] c.TestDaemon - 开始运行...
08:26:39.215 [main] c.TestDaemon - 运行结束...

2. 线程的状态
2.1 操作系统概念下的五种:

2.2 java层面的六种:

网友评论