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();
 }
}

时间: 2025-01-01 20:55:51

Lock锁与Condition监视器(生产者与消费者)。的相关文章

使用JUC并发工具包的Lock和Condition,实现生产者和消费者问题中的有界缓存

JDK5.0之前,用java实现生产者和消费者的唯一方式就是使用synchronized内置锁和wait/notify条件通知机制.JDK5.0之后提供了显示锁Lock和条件队列Condition,与内置锁和内置条件队列相对应,但是显示的锁和条件队列,功能更强大,更灵活.此外JDK5.0之后还提供了大量很有用的并发工具类,如BlockingQueue等,基于这些数据结构,能够方便.快速.高效的构建自己应用需要的效果.这里我们简单使用下显示锁和条件队列,来模拟有界缓存的实现,功能类似于JDK内置的

用ReentrantLock和Condition实现生产者和消费者模式

前面一篇文章<wait.notify应用场景(生产者-消费者模式)>是一种生产者消费者模式实现,今晚这是Lock方式实现,下面是源码: 生产者代码: /** * 生产者 * * @author tangquanbin * @date 2018/12/18 22:10 */ public class Producer implements Runnable { /** * 产品容器 */ private List<Integer> container; private Lock lo

20181229(守护进程,互斥锁,IPC,生产者和消费者模型)

一.守护进程 守护进程:一个进程B守护另一个进程A,当被守护的进程A结束,进程B也就结束了.(不一定同生,但会同死) 两个特点: ①守护进程会在主进程代码执行结束后就终止 ②守护进程内无法再开启子进程,否则抛出异常. 注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止 应用场景:如果主进程认为一旦自己结束,子进程也就没有继续运行的必要了,就可以将子进程设置为守护进程.(例如:qq正在调用自身的下载文件功能,但是此时退出了qq,下载进程也就可以直接关闭了) 方法为:process.d

守护进程,互斥锁,IPC,生产者与消费者模型

守护进程: b 进程守护 a进程,当a进程执行完毕时,b进程会跟着立马结束 守护进程用途: 如果父进程结束了,子进程无需运行了,就可以将子进程设置为父进程的守护进程 例如我们qq视频聊天时,当我们退出qq时,视频界面会跟着退出,视频就是qq的守护进程 守护进程语法: p.daemon = True #1.未设置守护进程 from multiprocessing import Process import time def task(): print("子进程run") time.sle

java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)

一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.concurrent.locks.ReentrantLock 锁,JDK也为我们提供了与此功能相应的类java.util.concurrent.locks.Condition.Condition与重入锁是通过lock.newCondition()方法产生一个与当前重入锁绑定的Condtion实例,我们

java使用lock实现一个简单的生产者和消费者模式

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class Five { public static void main(String[] args) { final Service myService = new Service(); for(int i = 0 ; i < 10 ; i ++){ Thread thread = new Th

线程高级篇-Lock锁和Condition条件

浅谈Synchronized: synchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其他线程 便只能一直等待,等待获取锁的线程释放锁,而获取锁的线程释放锁会有三种情况: 1).获取锁的线程执行完该代码块,然后线程释放对锁的占有; 2).线程执行发生异常,此时JVM会让线程自动释放锁; 3).调用wait方法,在等待的时候立即释放锁,方便其他的线程使用锁. Lock的特性: 1).Lo

LMAX Disrutpor—多生产者多消费者中,消息复制分发的高性能实现

解决的问题 当我们有多个消息的生产者线程,一个消费者线程时,他们之间如何进行高并发.线程安全的协调? 很简单,用一个队列. 当我们有多个消息的生产者线程,多个消费者线程,并且每一条消息需要被所有的消费者都消费一次(这就不是一般队列,只消费一次的语义了),该怎么做? 这时仍然需要一个队列.但是: 1. 每个消费者需要自己维护一个指针,知道自己消费了队列中多少数据.这样同一条消息,可以被多个人独立消费. 2. 队列需要一个全局指针,指向最后一条被所有生产者加入的消息.消费者在消费数据时,不能消费到这

多线程--简单生产者与消费者(Lock锁)

前两篇的生产者与消费者(多线程)运用的是synchronized进行同步锁的,本次将运用JDK1.5提供的Lock锁. 它 将synchronized替换成了Lock将Object中的wait notify notifyAll替换成了Condition对象, Condition可以被Lock获取, 可以创建多个Condition对象,只唤醒对方操作. 具体代码如下: package cn.zz; import java.util.concurrent.locks.Condition;import