《Java高并发编程详解-多线程架构与设计》Thread API

摘自《Java高并发编程详解-多线程架构与设计》第三章

1.sleep不会释放monitor锁的所有权

2.使用TimeUnit.XX.sleep代替Thread.sleep

3.yield让出CPU资源

在这里插入图片描述

4.yield与sleep的区别

jdk1.5之前 yield 实际调用sleep(0)
sleep 会暂停线程指定时间, 没有时间片的消耗
yield只是对cpu一个hint,cpu调度器可以忽略该提示,若未忽略会导致线程上下文切换。
yield导致 线程状态从 RUNNING->RUNNABLE
sleep能捕捉到另一个线程的

5.线程优先级

优先级默认为5,可选范围在1-10
不一定有效果。特别在CPU闲时

6.线程Id

自建的线程,id并不是0,因为自建的线程并不是第一个线程。

7.getContextClassLoader获取线程上下文类加载器

可以通过setContextClassLoader打破双亲委派。(loadClass)
在这里插入图片描述

8.interrupt

可以打断阻塞。
进入阻塞:wait/sleep/join,IntetruptiableChannel的io操作,selector的waeup

9.isInterrupted

判断线程标志位,判断其是否中断。

9.1 错误写法:

注意,这里调用了interrupt ,线程t也没有中断!! 因为其未进入阻塞状态(这里是loop)
在这里插入图片描述

9.2 正确写法:

正确的写法是 在线程中使用 while (!Thread.currentThread().isInterrupted())
在这里插入图片描述

10.interrupted会直接擦除掉interrupt的标志

如果线程被中断,第一次调用interrupted方法会返回true,第二次会返回false.

在这里插入图片描述

11.Join本质是whie(thread.isAlive) thread.wait()

本质是 whie(thread.isAlive) thread.wait() ,等到thread死亡后,也就不需要notify
一定程度可以代替executor.invokeAll

在这里插入图片描述

注意这里是主线程被join阻塞了,且虽然每次都join一个线程,但是其他线程早已启动, 所以不一定会按顺序执行, 只是主线程会按顺序判断。

在这里插入图片描述

12.线程的退出

12.1 线程运行完毕
12.2 捕捉中断信号
12.3使用volatile开关变量

发布于2019年7月7日 16:39:26

posted @ 2019-07-21 01:16  thewindkee  阅读(123)  评论(0编辑  收藏  举报