Lock锁与Condition监视器(生产者与消费者)。
/*生产者与消费者第二次敲,本人表示很郁闷,以后要经常读这个
* Condition 将Object类中的监视器(wait notify notifyAll)分解成不同的对象。例如condition_pro.await():
* condition_com.signal();这两个语句,分别是实例化了*_pro与*_com这两个对象,分别通过调用不同的对线程操作的方法来实现对线程的操作 */ package LockMethod;
import java.util.concurrent.locks.*;//condition,Lock接口都在此包中
class Resource2
{
private String name;//私有化商品名称
private int commodity=100;//私有化商品编号
private boolean flag=false;//定义一个boolean 型的线程切换标记
private Lock lock=new ReentrantLock();//建立一个锁的对象,多态,父类引用指向子类对象。
Condition condition_pro=lock.newCondition();//实例化一个Condition对象,Condition实例实质是绑定在一个锁上,此语句表示为特定的lock对象获取Condition对象
Condition condition_con=lock.newCondition();
public void set(String name) throws InterruptedException//await()方法抛出异常,API文档写出。set方法为生产者生产商品
{ lock.lock();//上锁。目的是同为生产者的t1,t2或者同为消费者的t3T4只能按序执行,不会发生一个商品生产了两次或者被消费了两次
try
{
while(flag)
condition_pro.await();//await()方法在API文档中有抛出异常,所以在方法上需要throws 一下
this.name=name+commodity++;
System.out.println(Thread.currentThread().getName()+"---producer"+this.name);
flag=true;//改变线程转换标记,使得当前线程再经过一次循环时可以挂那,因为生产一次,消费一次,不能使其再生产一次
condition_con.signal(); //唤醒消费者的线程,使得生产的上品被消费
}
/*catch(Exception e)
{ }*/
finally//其中代码为必须要执行的语句
{
lock.unlock();//finally中的代码是必须要执行的,解锁,以便让下一个线程可以执行。
}
}
public void out() throws InterruptedException//out方法为消费者消费商品
{
lock.lock();
try
{
while(!flag)//在该线程未被唤醒前,已经通过flag=true;改变了判断值。所以加!使得在消费者线程执行时不指向while中的awake();使其能println()顺利被消费
condition_con.await();
System.out.println(Thread.currentThread().getName()+"---消费者"+this.name);
flag=false;//改变标记,使消费者执行while语句,执行awake(),挂那,等待生产者生产一个商品后在次被唤醒
condition_pro.signal();//唤醒生产者线程
}
finally
{
lock.unlock();//解锁
}
}
}
class Producer2 implements Runnable//实现接口,调用线程要执行的run方法
{
private Resource Res;//私有一个Resource对象
Producer2(Resource Res)//构造函数,传入Resource对象
{
this.Res=Res;
}
public void run()//生产线程所要执行的代码
{
try
{
while(true)//while(true)记住格式,无线循环
Res.set("商品");//调用生产方法,生产产品
}
catch(Exception e)
{ }
}
}
class Consumer2 implements Runnable
{
private Resource Res;//私有一个Resource对象
Consumer2(Resource Res)//构造函数,传入Resource对象
{
this.Res=Res;
}
public void run()//消费线程所要执行的代码
{
try
{
while(true)
Res.out();//调用消费方法,消费商品
}
catch(Exception e)
{ }
}
} public class LockMethod2
{
public static void main (String[] args)
{
Resource r=new Resource();//创建Resource对象 Consumer2 con=new Consumer2(r);//分别创建生产者消费者对象,并使其指向Resource对象
Producer2 pro=new Producer2(r); Thread t1=new Thread(pro);//创建线程1234,分别指向生产者和消费者。
Thread t2=new Thread(pro);
Thread t3=new Thread(con);
Thread t4=new Thread(con); t1.start();//启动线程
t2.start();
t3.start();
t4.start();
}
}
Lock锁与Condition监视器(生产者与消费者)。的更多相关文章
- condition版生产者与消费者模式
1.简介 在爬虫中,生产者与消费者模式是经常用到的.我能想到的比较好的办法是使用redis或者mongodb数据库构造生产者消费者模型.如果直接起线程进行构造生产者消费者模型,线程容易假死,也难以构造 ...
- 用ReentrantLock和Condition实现生产者和消费者模式
前面一篇文章<wait.notify应用场景(生产者-消费者模式)>是一种生产者消费者模式实现,今晚这是Lock方式实现,下面是源码: 生产者代码: /** * 生产者 * * @auth ...
- 20181229(守护进程,互斥锁,IPC,生产者和消费者模型)
一.守护进程 守护进程:一个进程B守护另一个进程A,当被守护的进程A结束,进程B也就结束了.(不一定同生,但会同死) 两个特点: ①守护进程会在主进程代码执行结束后就终止 ②守护进程内无法再开启子进程 ...
- 守护进程,互斥锁,IPC,生产者与消费者模型
守护进程: b 进程守护 a进程,当a进程执行完毕时,b进程会跟着立马结束 守护进程用途: 如果父进程结束了,子进程无需运行了,就可以将子进程设置为父进程的守护进程 例如我们qq视频聊天时,当我们退出 ...
- ReentrantLock和Condition实现生产者和消费者
一个生产者和一个消费者 public class ConditionTest { private static ReentrantLock lock = new ReentrantLock(); pr ...
- (删)Java线程同步实现二:Lock锁和Condition
在上篇文章(3.Java多线程总结系列:Java的线程同步实现)中,我们介绍了用synchronized关键字实现线程同步.但在Java中还有一种方式可以实现线程同步,那就是Lock锁. 一.同步锁 ...
- java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...
- 线程高级篇-Lock锁和Condition条件
浅谈Synchronized: synchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其 ...
- java使用lock实现一个简单的生产者和消费者模式
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public ...
随机推荐
- bzoj 3129
非常好的一道数学题,考察了大量数论和组合数学的知识 在做本题之前强烈建议先完成下列两个背景知识: ①: bzoj 2142礼物 因为本题的一部分数据需要利用到拓展卢卡斯定理,而礼物是拓展卢卡斯定理的裸 ...
- Java基础之多线程框架
一.进程与线程的区别 1.定义: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比 ...
- java获取当前时间精确到毫秒
转载:http://af8991.iteye.com/blog/1217672 import java.text.SimpleDateFormat; import java.util.Date; im ...
- linux:安装Memcache并使用
1.Linux安装Memcache : curl -O http://memcached.org/files/memcached-1.5.4.tar.gz 解压 2.启动Memcache: memca ...
- 集腋成裘-03-css基础-02
1.1 三种写法 内嵌式:样式只作用于当前文件,没有真正实现结构表现分离 外链式:作用范围是当前站点,真正实现了内容与表现分离 行内样式:仅限于当前标签,结构混在一起 1.2 标签分类 1.2.1 块 ...
- 查找所有sphinx引擎表并生成创建表的语句
-- 查找所有sphinx引擎select group_concat(table_name separator ' ') from information_schema.tables where en ...
- Unable to locate package python-pip
原文:https://blog.csdn.net/yyinhai/article/details/53056973 Ubuntu下执行apt install python-pip得到如下错误提示: R ...
- WPF 下两种图片合成或加水印的方式(转载)
来源:http://www.cnblogs.com/lxblog/ 最近项目中应用多次应用了图片合成,为了今后方便特此记下. 在WPF下有两种图片合成的方式,一种还是用原来C#提供的GDI+方式,命名 ...
- Redis的并发竞争问题
问题描述:多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了.或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了. 一个key的值是1,本来按顺序 ...
- 解决win7 安装完jdk7后,再安装jdk8出现的问题 has value '1.8', but '1.7' is required.
http://blog.csdn.net/qiyueqinglian/article/details/46605759 电脑装了jdk8,JAVA_HOME也是设置的8. 不删除8变回7. 改了JAV ...