博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Condition实现多线程之间调用
阅读量:4290 次
发布时间:2019-05-27

本文共 2472 字,大约阅读时间需要 8 分钟。

一,object 类的wait,notify和notifyAll

Java 线程类也是一个object 类,它的实例都继承自java.lang.Thread 或其子类。wait,notify和notifyAll是Object类中的方法,常用于线程之间调度。

线程无数据运行可调用wait让线程等待,不占用CUP资源,提高CPU有效的利用率。例如,线程 B 可以等待线程 A 的一个信号,这个信号会通知线程 B 数据已经准备好了,B可以执行业务逻辑。

线程之间调度常应用于生产与消费模式下。

利用Object 对象的wait,notify和notifyAll可以实现,但JDK1.5后有更好的替代方法。

二,Condition 类增强类

Condition 类,实现线程间的协作,相比使用Object的wait、notify,使用Condition的await、signal这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition。

Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition 调用Condition的await和signal方法,必须在lock.lock和lock.unlock之间才可以使用

三,Object与Conditon 对比

Conditon中的await对应Object的wait;

Condition中的signal对应Object的notify;

Condition中的signalAll对应Object的notifyAll。

四,使用Condition 实现生产消费

import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * Created by tank  on 2016/11/22. * 使用Condition 实现线程间生产消费模式 */public class ConditionDemo {    Object queue = new Object[100];//队列    int readIndex = 0;//read索引位置    int writeIndex = 0;    int dataLen = 0;    final Lock lock = new ReentrantLock;    final Condition fullCondition = lock.newCondition;    final Condition emptyCondition = lock.newCondition;    public static void main(String[] args) {        final ConditionDemo demo = new ConditionDemo;        new Thread { @Override public void run { for (int i = 0; i < 1000; i++) { demo.write(i); } }        }.start;        new Thread { @Override public void run { while (true) { Object obj = demo.read; if (obj != null) { System.out.println((Integer) obj); } } }        }.start;    }    //生产    public void write(Object obj) {        lock.lock;        try { if (dataLen >= queue.length) {//队列写满了 System.out.println("队列写满了,等待....."); fullCondition.await; System.out.println("队列有空位了,唤醒....."); } queue[writeIndex] = obj; writeIndex++; dataLen++; if (writeIndex >= queue.length) { writeIndex = 0; } emptyCondition.signal;        } catch (InterruptedException e) { e.printStackTrace;        } finally { lock.unlock;        }    }    //消费    public Object read {        lock.lock;        try { if (dataLen <= 0) { System.out.println("队列空了,等待数据....."); emptyCondition.await; System.out.println("队列有数据了,唤醒....."); } Object obj = queue[readIndex]; readIndex++; dataLen--; if (readIndex >= queue.length) { readIndex = 0; } fullCondition.signal; return obj;        } catch (InterruptedException e) { e.printStackTrace;        } finally { lock.unlock;        }        return null;    }}

转载地址:http://kxggi.baihongyu.com/

你可能感兴趣的文章
c++读取utf8等不同编码文件
查看>>
STL中的vector
查看>>
C++中的map
查看>>
Python小时钟
查看>>
C语言清空getchar缓冲区
查看>>
python中的全局变量
查看>>
python的decode和encode
查看>>
c++词法分析器
查看>>
python中的is、==和cmp()
查看>>
python Tkinter的image不能显示的问题
查看>>
python 中的相互import问题
查看>>
linux 使用锐捷认证上网
查看>>
JavaScript 正则表达式的test,exec,match
查看>>
JavaScript 函数引用的疑问
查看>>
JavaScript 参数 arguments深入了解以及javascript内置数据类型的讨论
查看>>
安卓开发JavaScript调用Java
查看>>
使用webview要注意的问题
查看>>
利用ServerSocket获取浏览器http请求的header
查看>>
JavaScript 在for循环中绑定事件
查看>>
git获取旧版本
查看>>