015.2Condiction接口
Condiction对象能够让线程等待,也能够唤醒相应的线程,通过下面方法,具体看代码:
await();
signal();
signalAll();
使用步骤:
1)创建锁
2)通过锁拿到Condiction对象
3)Condiction对象等待后,就需要别人唤醒才会继续执行该进程
例子代码:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class NewProducerConsumerCondition
{ public static void main(String[] args)
{
Resource r = new Resource(); //2,创建线程任务。
Producer pro = new Producer(r);
Consumer con = new Consumer(r); //3,创建线程。
Thread t1 = new Thread(pro);
Thread t2 = new Thread(pro);
Thread t3 = new Thread(con);
Thread t4 = new Thread(con); t1.start();
t2.start();
t3.start();
t4.start();
} } class Resource{
private String name;
private int count = 1;
private final Lock lock = new ReentrantLock();
private Condition produce = lock.newCondition();
private Condition consume = lock.newCondition();
private boolean flag = false;
public void set(String name)
{
lock.lock();
try{
while(flag){
try{produce.await();}catch(Exception e){} //Condiction对象等待
}
this.name = name + count;
count += 1;
System.out.println(Thread.currentThread().getName()+"-----生产者-------"+this.name);
flag = true;
consume.signalAll();
}finally{
lock.unlock();
}
} public void out()
{
lock.lock();
try{
while(!flag){
try{consume.await();}catch(Exception e){}
}
System.out.println(Thread.currentThread().getName()+"-----消费者-------"+this.name);
flag = false;
produce.signalAll();
}finally{
lock.unlock();
}
}
} class Producer implements Runnable
{
private Resource r ;
// 生产者一初始化就要有资源,需要将资源传递到构造函数中。
Producer(Resource r)
{
this.r = r;
}
public void run()
{
while(true)
{
r.set("大白兔奶糖");
}
}
} class Consumer implements Runnable
{
private Resource r ;
// 消费者一初始化就要有资源,需要将资源传递到构造函数中。
Consumer(Resource r)
{
this.r = r;
}
public void run()
{
while(true)
{
r.out();
}
} }
class BoundedBuffer
{
final Lock lock = new ReentrantLock();// 锁
final Condition notFull = lock.newCondition(); // 生产
final Condition notEmpty = lock.newCondition(); // 消费 final Object[] items = new Object[100];// 存储商品的容器。
int putptr/* 生产者使用的角标 */, takeptr/* 消费者使用的角标 */, count/* 计数器 */; /* 生产者使用的方法,往数组中存储商品 */
public void put(Object x) throws InterruptedException
{
lock.lock();
try {
while (count == items.length) // 判断计数器是否已到数组长度。满了。
notFull.await();// 生产就等待。 items[putptr] = x; // 按照角标将商品存储到数组中 if (++putptr == items.length) // 如果存储的角标到了数组的长度,就将角标归零。
putptr = 0;
++count;// 计数器自增。
notEmpty.signal();// 唤醒一个消费者
} finally {
lock.unlock();
}
} public Object take() throws InterruptedException
{
lock.lock();
try {
while (count == 0) // 如果计数器为0,说明没有商品,消费者等待。
notEmpty.await();
Object x = items[takeptr]; // 从数组中通过消费者角标获取商品。 if (++takeptr == items.length) // 如果消费的角标等于了数组的长度,将角标归零。
takeptr = 0;
--count;// 计数器自减。
notFull.signal();// 唤醒生产者。
return x;
} finally {
lock.unlock();
}
}
}
能存多个商品的店
015.2Condiction接口的更多相关文章
- 第11章 拾遗1:网络地址转换(NAT)和端口映射
1. 网络地址转换(NAT) 1.1 NAT的应用场景 (1)应用场景:允许将私有IP地址映射到公网地址,以减缓IP地址空间的消耗 ①需要连接Internet,但主机没有公网IP地址 ②更换了一个新的 ...
- 第10章 网络安全(5)_访问控制列表ACL
6. 访问控制列表ACL 6.1 标准访问控制列表 (1)标准ACL ①标准ACL是基于IP数据包的源IP地址作为转发或是拒绝的条件.即,所有的条件都是基于源IP地址的. ②基本不允许或拒绝整个协议组 ...
- linux 学习笔记一
Linux 学习笔记一 计算机 主要分为五个部分:控制器,运算器,存储器,输入设备,输出设备. 操作系统 操作系统就是针对硬件编写的程序,同时提供硬件接口调用的接口.操作系统需要处理如管理与配置内存. ...
- Linux-两种磁盘分区方式
Linux文件设备 要理解Linux,首先要理解Linux文件结构 在Linux操作系统中,几乎所有的设备都位于/dev目录中 名称 作用 位置 SATA接口 电脑硬盘接口 /dev/sd[a-p] ...
- 015.1 Lock接口
内容:Lock接口使用步骤,同步生产大白兔奶糖的例子 同步代码块的锁是隐式的,显式容易让我们理解.所以我们使用这个显式的方法,方便理解代码.######实现同步步骤:1.获取锁:lock()2.同步代 ...
- ledisdb:支持类redis接口的嵌入式nosql
ledisdb现在可以支持嵌入式使用.你可以将其作为一个独立的lib(类似leveldb)直接嵌入到你自己的应用中去,而无需在启动单独的服务. ledisdb提供的API仍然类似redis接口.首先, ...
- 【高速接口-RapidIO】2、RapidIO串行物理层的包与控制符号
一.RapidIO串行物理层背景介绍 上篇博文提到RapidIO的物理层支持串行物理层与并行物理层两种,由于Xilinx 部分FPGA内部已经集成了串行高速收发器,所以用FPGA实现RapidIO大多 ...
- PHP开发接口,封装方法
接口的主要功能是从服务器端获取数据,然后渲染到客户端 其主要的实现流程一般会经历这样的几个阶段服务器端----> 数据库|缓存 ----> 调用接口 ---->客户端 在接口数据传输 ...
- 如何在编辑框中使用IAutoComplete接口(转载)
出自:http://www.vckbase.com/index.php/wv/27.html 如果可能我想用打包类来实现.唉!,就叫我封装先生吧. 你算是找对地方了.但是我要先声明我的解决办法不是你所 ...
随机推荐
- 10种jquery选择器操作详解(转)
jquery选择器大体上可分为4 类: 1.基本选择器2.层次选择器3.过滤选择器4.表单选择器 其中过滤选择器可以分为:1.简单过滤选择器2.内容过滤选择器3.可见性过滤选择器4.属性过滤选择器5. ...
- CUBA-Platform将全面助力中国开发者
关注CUBA的伙伴们,你们好! 今天我们有新的进展告诉大家. 九月十五日到十六日CUBA平台事业部负责人(同时也是Haulmont公司合伙人)专程来到中国与CUBA中国团队进行了两天时间的交流.讨论. ...
- c# Dictionary 中Keys.ToArray<>方法的细节测试
/// <summary> /// dic.Keys.ToArray<>方法生成数组的顺序和dic中的顺序相同 /// </summary> public stat ...
- layer关闭弹出层返回值到父页面
1.首先在父页面定义一个空间,Id=layerResult 然后 layer.open({ type: , title: '选择看课件', shadeClose: true, shade: 0.8, ...
- Connection连接、关闭数据库
创建连接sql server数据库的字符一般有两种, 一种是以sql验证登录的 一种是以windows身份验证的 步骤: 引用命名空间System.Date.SqlClient 将连接方法声明至字符串 ...
- Java基础(3)——变量
从这篇文章起开始正式进入正题啦,本文将较为简单的介绍一下变量以及常量.变量,顾名思义,就是可以变的量,常量那么久相反了,常常不变的量就叫常量._(¦3」∠) 变量 在 Java 中,任何一个变量都得有 ...
- 961 -尺寸2N阵列中的N重复元素
在一个A大小的数组中2N,有N+1独特的元素,这些元素中的一个重复N次. 返回重复N次的元素. 例1: 输入:[1,2,3,3] 输出:3 例2: 输入:[2,1,2,5,3,2] 输出:2 例3: ...
- Groovy内存机制详解
groovy每执行一次脚本,都会生成一个脚本的class对象,并new一个InnerLoader去加载这个对象. 所有的脚本都是由GroovyClassLoader加载的,每次加载脚本都会生成一个新的 ...
- Java 集合:迭代器(Iterator, Iterable)
Iterator接口 public interface Iterator<E> { boolean hasNext(); E next(); void remove(); } 访问元素前需 ...
- \n\r 转义字符
转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) ,将当前位置移到前一列 008 \f 换页(FF),将当前位置移到下页开头 012 \n 换行(LF) ,将 ...