线程通信 3种方式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/jinknow/article/details/80275010

一、传统线程通信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()

猜你喜欢

转载自blog.csdn.net/jinknow/article/details/80275010