线程基础:
1:Java 中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)。守护线程依赖非守护线程的存在,比如垃圾回收现场。如果用户线程结束,守护线程也会退出。
2:线程的状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED
3:sleep和wait有什么区别?
1)这两个方法来自不同的类分别是Thread和Object
2)最主要是sleep方法没有释放锁,而wait方法释放了锁
3)wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep
可以在任何地方使用
4)sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
注意:上图中Java线程没有Running这个状态,可执行和执行中都属于Runnable
(1)线程有3种状态:领导leading,处理processing,追随following
(2)假设共N个线程,其中只有1个leading线程(等待任务),x个processing线程(处理),余下有N-1-x个following线程(空闲)
(3)有一把锁,谁抢到就是leading,它的任务是等待新任务。
(4)事件/任务来到时,leading线程会对其进行处理,从而转化为processing状态,处理完成之后,又转变为following
(5)丢失leading后,following会尝试抢锁,抢到则变为leading,否则保持following
(6)following不干事,就是抢锁,力图成为leading
在延迟队列DelayQueue中可以看这种线程模式。这种队列常见用于以下问题:
a) 关闭空闲连接。服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之。
b) 缓存。缓存中的对象,超过了空闲时间,需要从缓存中移出。
c) 任务超时处理。在网络协议滑动窗口请求应答式交互时,处理超时未响应的请求。
2019-07-19
关于线程的状态(state),我做了一些测试
Thread.sleep : TIMED_WAITING
join(long millis) : TIMED_WAITING
ReentrantLock : WAITING
join: WAITING
synchronized: BLOCKED
更加详细见下图: