文章目录
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