diff --git a/notes/Java 并发.md b/notes/Java 并发.md index cf9a6461..0f877ec6 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -176,7 +176,9 @@ main() 属于非后台线程。 阻塞是一种状态,而睡眠和挂起是一种手段,通过睡眠和挂起可以让一个线程进入阻塞状态。 -睡眠和挂起这两种手段的区别是,一个使用睡眠方式阻塞的线程在一个指定的时间之后(Thread.sleep(millisec) 的 millisec 参数指定)会退出阻塞状态,而一个使用挂起方式阻塞的线程必须等到其它线程给它发消息它才能退出阻塞状态。 +睡眠和挂起这两种手段的区别是,挂起手段会释放对象锁,而阻塞手段不会。 + +应该注意的是,睡眠和挂起都可以设置一个等待时间,超过等待时间之后,线程会退出阻塞状态。但是如果不为挂起设置等待时间,那么它只能等到通知的到来才能退出阻塞状态。 ## 中断 @@ -305,7 +307,6 @@ public synchronized void before() { 1. wait() 是 Object 类的方法,而 sleep() 是 Thread 的静态方法; 2. 挂起会释放锁,睡眠不会。 -3. 挂起必须等待其它线程的通知才能结束阻塞状态,而睡眠会在一定的时间之后自动结束。 ### 2. BlockingQueue @@ -405,9 +406,9 @@ Consumer-4 is consuming product.( Made By Producer-4 ) 1. 新建(New):创建后尚未启动; 2. 可运行(Runnale):可能正在运行,也可能正在等待 CPU 时间片; 3. 无限期等待(Waiting):等待其它线程显示地唤醒,否则不会被分配 CPU 时间片; -4. 限期等待(Timed Waiting):无序等待其它线程显示地唤醒,在一定时间之后会被系统自动唤醒; +4. 限期等待(Timed Waiting):无需等待其它线程显示地唤醒,在一定时间之后会被系统自动唤醒; 5. 阻塞(Blocking):等待获取一个排它锁,如果其线程释放了锁就会结束此状态; -6. 死亡(Terminated) +6. 死亡(Terminated):可以是线程结束任务之后自己结束,或者产生了异常而结束,中断机制就是使用了抛出中断异常的方式让一个阻塞的线程结束。 # 六、Executor