多线程--简单生产者与消费者(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 java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class Resource3 {
private String name;
private int count;
private boolean flag = false;
private Lock lock = new ReentrantLock();
Condition condition_Pro = lock.newCondition();
Condition condition_Con = lock.newCondition();

public void set(String name) throws Exception {
lock.lock();
try {
while (flag) {
condition_Pro.await();
this.name = name + "..." + count++;
System.out.println(Thread.currentThread().getName() + "...生产者"
+ this.name);
flag = true;
}
} finally {
condition_Con.signal();
}
}

public void out() throws Exception {
lock.lock();
try {
while (!flag) {
condition_Pro.await();
this.name = name + "..." + count++;
System.out.println(Thread.currentThread().getName()
+ "...消费者....." + this.name);
flag = false;
}
} finally {
condition_Pro.signal();
}

}

class Producer3 implements Runnable {
Resource3 res3;

public Producer3(Resource3 res3) {
this.res3 = res3;
}

@Override
public void run() {
while (true) {
try {
res3.set("商品");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

}

class Consumer3 implements Runnable {
Resource3 res3;

public Consumer3(Resource3 res3) {
this.res3 = res3;
}

@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
res3.out();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}

public class ProducerAndConsumer3 {
public void main(String[] args) {
Resource2 res2 = new Resource2();

new Thread(new Producer2(res2)).start();
new Thread(new Producer2(res2)).start();
new Thread(new Consumer2(res2)).start();
new Thread(new Consumer2(res2)).start();

}
}
}

运行结果如上。

原文地址:https://www.cnblogs.com/twqwe/p/9749927.html

时间: 2024-10-28 22:23:55

多线程--简单生产者与消费者(Lock锁)的相关文章

Java 多线程 简单实例 (消费者与生成者)的关系

PS::线程这套东西在PHP里完全是不存在的概念,有待进一步的学习: PS::这个实例是根据书本上的知识进行扩展的,理解程度50%左右吧! 1.定义生产消费环境 package second; public class Queue { int value = 0; boolean isEmpty = true; /** * 生产者 * @param v */ public synchronized void put(int v){ if(!isEmpty){//如果存在数据没有被消费 try{

多线程--简单生产者消费者升级版

如果有多个生产者和多个消费者 像之前那样就会产生安全问题,例如 会打印两个生产者一个消费者 或者一个生产者两个消费者 . 为了防止这种情况的发生(线程醒了没有去判断标记),需要将if()改为while 这样当线程有等待状态被唤醒的时候可以进行循环判断,但是又由于这样会使同一类线程全部阻塞进入等待状态,没有唤醒另一类线程因此需要将this.notify()变为this.notifyAll(): 将唤醒另一类的线程进行执行. package cn.zz; class Resource2 { priv

Java:多线程之生产者与消费者

要求:用两个线程模拟存票.售票过程.但要求每存入一张票,就售出一张票,售出后,再存入,直到售完为止. 用到的知识点:线程等待.唤醒.可能的线程中断异常 下面的方式一和方式二采用的是唤醒所有等待的线程,即wait()和notify()方法 方式一:继承Thread class Tickets //定义(资源)票类 { protected int size;//总票数 int number=0; //票号 Boolean available=false;//表示当前是否有票可售 public Tic

java 22 - 16 多线程之生产者和消费者的问题

生产者和消费者问题的描述图 通过上图,我们可以发现: 生产者和消费者使用的都是同一个资源(肉包子) 所以,当使用线程的时候,这两类的锁也是同一把锁(为了避免出现线程安全问题) 例子:学生信息的录入和获取 * 资源类:Student * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread(消费者) * 测试类:StudentDemo * 资源类:Student 1 public class Student { 2 3 String name; 4 int age; 5

java_多线程_生产者与消费者(并发协作)

对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一样,Hello World!都是最经典的例子. 实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了.对于此模型,应该明确一下几点:1.生产者仅仅在仓储未满时候生产,仓满则停止生产.2.消费者仅仅在仓储有产品时候才能消费,仓空则等待.3.当消费者发现仓储没产品可消费时候会通知生产者生产.4.生产者在生产出可消费产品时候,应该通知等待的消费者去消费. packa

java多线程实现生产者与消费者---经典问题

前几天老师领着学习了一下单线程和多线程的题目. 这里是操作系统中非常经典的题目,生产者和消费者的题,这里涉及的是仓库, 只有一个人(生产者或消费者)进入,另一个人只有等待. 这里的重点是关于传值的问题.一定要保持一致,不然,对于存和取 的对象,就可能出现多个. //========================================================================// 仓库类 //====================================

Java多线程的生产者与消费者模型,线程间的通信

java多线程中的生产者与消费者模式:首先有一个阻塞队列,生产者将生产的东西放到队列里,消费者再从队列中取.当队列中的东西数量达到其容量就发生阻塞. import java.util.Random; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import jav

Linux下用条件变量实现多线程间生产者与消费者问题

一. 线程间的同步还有这样一种情况:线程A需要等某个条件成立才能继续往下执行,现在这个条件不成立,线程A就阻塞等待,线程B在执行过程中使这个条件成立了,就唤醒线程A继续执行.在pthread库中通过条件变量(Condition Variable)来阻塞等待某个条件,或者唤醒等待这个条件的线程.Condition Variablepthread_cond_t类型的变量表,可以这样初始化和销毁: 返回值:成功返回0,失败返回错误号. 一个Condition Variable总是和一个Mutex搭配使

多线程之生产者与消费者问题

之前感觉非常easy,可是有一次面试让我在纸上写,竟然没写对丢人啊. 生产者消费者问题(Producer-consumer problem):生产者不断地生产产品.消费者取走生产者生产的产品.生产者生产出产品后将其放到一个区域之中.消费者从这个地方去除数据. 涉及的问题:要保证生产者不会在缓冲区满时增加数据,消费者也不会在缓冲区中空时消耗数据. 主要涉及:多线程的同步问题. 1.如果生产者线程刚向数据存储空间加入了产品的名称,还没有加入产品的内容,程序就切到了消费者的线程,消费这的 线程将吧产品