版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一、传统线程通信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() |