美文网首页
并发编程(二):线程基本知识

并发编程(二):线程基本知识

作者: 圆企鹅i | 来源:发表于2021-05-30 16:03 被阅读0次

1. 常用方法

1.1 start & run

start :
让任务处于就绪状态。
cpu有时间片来运行这个线程,那么就会开始运行

run:
线程需要运行的任务具体内容

1.2 sleep & yield

sleep:

  1. 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)
  2. 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException
  3. 睡眠结束后的线程未必会立刻得到执行
  4. 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性

yield:

  1. 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程
  2. 具体的实现依赖于操作系统的任务调度器
  3. 用于调试

注:区别: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();
知道自己是否有被打断 可以理解成线程之间发信号的一种方式

image.png
1.5.2 两阶段终止模式

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

image.png
注意:方法interrupted和isInterrupt
interrupted会在使用之后,清除打断标记 使他回复false
1.5.3 LockSupport.park

同样也能让任务停下来 ,但是专门为了和isInterrupt/interrupted配合
park之后 interrupt可以让线程继续运行
注意:如果线程处于isInterrupt=true状态 park无法停止

image.png
1.6 不推荐使用方法
image.png
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 - 运行结束...
image.png

2. 线程的状态

2.1 操作系统概念下的五种:
image.png
2.2 java层面的六种:
image.png

相关文章

网友评论

      本文标题:并发编程(二):线程基本知识

      本文链接:https://www.haomeiwen.com/subject/wixzxltx.html