一、传统线程通信synchronized + wait + notify
Object类的wait()、notify() 、notifyAll()三个方法必须由同步监视器对象来调用,分两种情况:
a)同步方法,该类默认实例(this)就是同步监视器,可以在同步方法中可以直接调用
b)同步代码块,同步监视器是synchronized后括号里的对象,所以必须使用此对象调用这三个方法
二、使用Condition控制线程通信lock + condition + await + signal
Lock代替同步方法或同步代码块,Condition替代同步监视器的功能。
private final Lock lock = newReentrantLock();
private final Condition con =lock.newCondition();
lock.lock(); con.await(); con.signalAll(); lock.unlock():
三、使用阻塞队列(BlockingQueue)控制线程通信
BlockingQueue接口主要作为线程同步的工具。当生产者试图向BlockingQueue中放入元素,如果队列已满,则线程被阻塞;当消费者试图向BlockingQueue中取出元素时,若该队列已空,则线程被阻塞。
为空或已满时 | 抛出异常 | 不同返回值false | 阻塞线程 | 指定超时时长 |
队尾插入 | add(e) | offer(e) | put(e) | offer(e,time,unit) |
队头删除并返回 | remove() | poll() | take() | poll(time,unit) |
获取不删除 | element() | peek() |
|
|