一些容易混淆的知识点
- sleep vs wait
sleep是Thread,wait是Object方法
wait和notify只能在同步代码块中调用
wait释放锁资源,sleep不释放锁资源
唤醒条件:wait通过notify或者notifyAll,sleep超时或者调用interrupt方法
关于Thread
类定义:
class Thread implements Runnable
Java doc:
每个线程都有优先级,线程的优先级与创建它的线程的优先级一样,当然,如果创建它的线程是daemon则创建出来的也是daemon
当JVM启动时,通常有一个non-daemon线程——该线程会调用指定类的main方法。
JVM会一直执行线程除非遇到下面两种情况:
- Runtime类的exit方法被调用或安全管理器允许退出操作
- 所有非守护线程死亡,要么从对run方法的调用返回,要么抛出一个在run方法之外传播的异常
内部类State:
NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED
所以你看到的所有的状态转换,在Java文档里有写。。。
- 优先级:最小1最大10 正常5
- new Thread的时候默认名字“Thread-” 加上线程数量
- Thread中有一个target,调用run的时候如果target != null则调用target的run方法
- 退出之前会调用一下exit()方法
- yield:告诉调度器处理器我暂时可以让给别的线程使用,调度器可以无视。很难正确使用,主要用于调试或测试。
- sleep:The thread does not lose ownership of any monitors.
- join:等待线程死亡,join(0)无限期等待
这里顺便看下Object的wait方法:The thread releases ownership of this monitor