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

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

文章目录

    • 1.sleep不会释放monitor锁的所有权
    • 2.使用TimeUnit.XX.sleep代替Thread.sleep
    • 3.yield让出CPU资源
    • 4.yield与sleep的区别
    • 5.线程优先级
    • 6.线程Id
    • 7.getContextClassLoader获取线程上下文类加载器
    • 8.interrupt
    • 9.isInterrupted
      • 9.1 错误写法:
      • 9.2 正确写法:
    • 10.interrupted会直接擦除掉interrupt的标志
    • 11.Join本质是whie(thread.isAlive) thread.wait()
    • 12.线程的退出

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

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

3.yield让出CPU资源

《Java高并发编程详解-多线程架构与设计》Thread API_第1张图片

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)
《Java高并发编程详解-多线程架构与设计》Thread API_第2张图片

8.interrupt

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

9.isInterrupted

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

9.1 错误写法:

注意,这里调用了interrupt ,线程t也没有中断!! 因为其未进入阻塞状态(这里是loop)
《Java高并发编程详解-多线程架构与设计》Thread API_第3张图片

9.2 正确写法:

正确的写法是 在线程中使用 while (!Thread.currentThread().isInterrupted())
《Java高并发编程详解-多线程架构与设计》Thread API_第4张图片

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

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

《Java高并发编程详解-多线程架构与设计》Thread API_第5张图片

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

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

《Java高并发编程详解-多线程架构与设计》Thread API_第6张图片

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

《Java高并发编程详解-多线程架构与设计》Thread API_第7张图片

12.线程的退出

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

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

你可能感兴趣的:(Java,读书笔记)