一 任务阻塞的可能原因
1:调用了sleep,线程进入休眠状态,在指定时间内不会允许
2:调用wait()将线程挂起,直到线程得到了notify()或者notifyAll()的消息(或者在java.util.concurrent类库种等价的signal()或signalAll()),线程才会进入就绪状态
3:任务在等待某个输入/输出完成
4:任务试图在某个对象上调用其同步控制方法,但是对象锁不可用,因为另外一个任务已经获得了锁
synchronized和ReentrantLock的区别,synchronized上阻塞的任务不可中断,ReentrantLock阻塞的任务可以被中断
二 线程间的协调
使用wait可以使任务挂起,并将锁释放,等待notify,notifyAll的通知,sleep也会将任务挂起,但是sleep不会释放锁。wait,notify,notifyAll是属于Object的方法,只能在synchronized修饰的方法或者代码块中调用,否则将会抛出IllegalMonitorStateException异常
三 生产者消费者
声生产者与消费者的实现可以使用wait,notify,notifyAll Condition的await,asignalAll实现,还可以使用同步队列实现,在BlockingQueue接口提供了这个队列,有LinkedBlockingQueue(链表),也有ArrayBlockingQueue(数组)