java 生产者和消费者

生产者和消费者的例子

一、wait() / notify()方法

wait() / nofity()方法是基类Object的两个方法,也就意味着所有Java类都会拥有这两个方法,这样,我们就可以为任何对象实现同步机制。

wait()方法:当缓冲区已满/空时,生产者/消费者线程停止自己的执行,放弃锁,使自己处于等等状态,让其他线程执行。

notify()方法:当生产者/消费者向缓冲区放入/取出一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态。

直接贴上代码 用as

class Person{
private String name;
private String sex;

private Boolean isEmpty = Boolean.TRUE;

public void set(String name,String sex){
synchronized(this){
while(!isEmpty.equals(Boolean.TRUE)){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.name=name;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.sex=sex;
isEmpty=Boolean.FALSE;
this.notifyAll();
}
}

public void get(){
synchronized(this){
while(!isEmpty.equals(Boolean.FALSE)){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String name=getName();
String sex=getSex();
System.out.println(name + " --> " + sex);
isEmpty=Boolean.TRUE;
this.notifyAll();
}
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}

}

class Producer implements Runnable{
private Person p;
public Producer(Person p){
this.p=p;

}

@Override
public void run() {
// TODO Auto-generated method stub
for(int i=2;i<100;i++){
if(i%2==0){
p.set("李果", "女");
}else{
p.set("李凡", "男");
}
}
}

}
class Consumer implements Runnable{
private Person p;
public Consumer(Person p){
this.p=p;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=2;i<100;i++){
p.get();
}
}

}
public class Productor_ConsumerDemo {

public static void main(String[] args) {
// TODO Auto-generated method stub
Person p = new Person();
new Thread(new Producer(p)).start();
new Thread(new Consumer(p)).start();

new Thread(new Producer(p)).start();
new Thread(new Consumer(p)).start();
}

}

用Synchronized 同步方法

await() / signal()方法

在JDK5.0之后,Java提供了更加健壮的线程处理机制,包括同步、锁定、线程池等,它们可以实现更细粒度的线程控制。await()和signal()就是其中用来做同步的两种方法,它们的功能基本上和wait() / nofity()相同,完全可以取代它们,但是它们和新引入的锁定机制Lock直接挂钩,具有更大的灵活性。通过在Lock对象上调用newCondition()方法,将条件变量和一个锁对象进行绑定,进而控制并发程序访问竞争资源的安全。下面来看代码:

class Person {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

private String sex;

private final ReentrantLock lock = new ReentrantLock();
private final Condition con = lock.newCondition();
private Boolean isEmpty = Boolean.TRUE;

public void set(String name, String sex) {
lock.lock();
while (!isEmpty.equals(Boolean.TRUE)) {
try {
con.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

try {
this.name = name;
Thread.sleep(1);
this.sex = sex;
isEmpty = Boolean.FALSE;
con.signal();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}

}

public void get() {
lock.lock();
while (!isEmpty.equals(Boolean.FALSE)) {
try {
con.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

try {
String name = getName();

String sex = getSex();
System.out.println(name + " --> " + sex);
isEmpty = Boolean.TRUE;
con.signal();

} finally {
lock.unlock();
}
}
}

class Productor implements Runnable {
private Person p;

public Productor(Person p) {
this.p = p;
}

@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 2; i < 100; i++) {
if (i % 2 == 0) {
p.set("李果", "女");
} else {
p.set("李雨軒", "男");
}
}
}

}

class Cosumer implements Runnable {
private Person p;

public Cosumer(Person p) {
this.p = p;
}

@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 2; i < 100; i++) {
p.get();
}

}

}

public class Producer_Demo {

public static void main(String[] args) {
// TODO Auto-generated method stub
Person p = new Person();

new Thread(new Productor(p)).start();
new Thread(new Cosumer(p)).start();
}

}

时间: 2024-08-07 00:08:46

java 生产者和消费者的相关文章

java 生产者 与 消费者的案例

主要理解了两个问题 1.线程数据同步的问题 2.线程交替运行的方式 package ThreadDemo; /** * 生产者与消费者的案例(一,同步的问题,值的问题 二,交替执行的问题) * @author lile * 同步的问题(synchronized 知识点) * 交替执行的问题(notify ,wait, 线程等待) */public class ThreadDemo { public static void main(String[] args) { Food food = new

java 生产者与消费者问题

package concurrency; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Storage { private int capacity; private int size; public Storage(int capacity){ this.capacity=capacity; size=0; } public synchronize

java 生产者与消费者初级探讨

最近学习java多线程有点迷糊,经过一天的整理,知道了什么是生产者,什么是消费者,以及消费者与生产者的关系: 在 Person类中是一个实体没有具体的对象,靠Input传入,Output读出,只有当Input有传入后,才能被Output读出,因此对呀Input和Output,要上一把同样的锁,synchronized将两个线程同步. wait(),notify(),notifyAll()都是继承至上帝类的:下面是生产者消费者的代码 //生产/消费者模式 public class Basket {

Java 生产者模式 消费者模式

1 // The standard idiom for calling the wait 2 synchronized(sharedObject) { 3 while(condition){ 4 sharedObject.wait();// Releases lock, and reacquires on wake up 5 } 6 // do action based upon condition e.g. take or put into queue 7 } 使用wait和notify函数的

JAVA 生产者和消费者Runnable实现,所有方法都放到对象里面,而非假店员之手

因为觉得把方法写到店员类里面,总是很怪异,不符合面向对象编程里面,谁的行为谁做. package com.home.nxj.ProTest; public class ProTest { public static void main(String[] args) { Clerk ck = new Clerk(); Productors p1 = new Productors(ck); Concumers c1 = new Concumers(ck); Thread t1 = new Threa

java 生产者和消费者demo

1 package com.benq; 2 3 import java.util.*; 4 import java.util.concurrent.TimeUnit; 5 6 public class HH { 7 public static void main(String[] args){ 8 9 var store=new MyStore<Integer>(20); 10 11 for(int i=0;i<10;i++){ 12 var producer=new Procuder&

Java线程同步模型-生产者与消费者

Java生产者与消费者模型是经典Java线程同步模型,涉及使用同步锁控制生产者线程和消费者线程同步运行问题.同步对象是仓库资源,生产者线程生产向仓库中生产商品,消费者线程从仓库中消费商品,当生产者线程生产的商品达到仓库的90%时,生产者线程停止生产并通知消费者线程开始消费,当消费者线程消耗到仓库的10%时,消费者线程停止消费并通知生产者线程恢复生产,如此循环往复过程. 如下图解: T1时刻分析 T2时刻 T3时刻 T4时刻 上图的分析,T3同T1时刻相同场景,T2同T2时刻相同场景,程序如此循环

java生产者消费者并发协作

随着职务转变,代码荒废很久了,很多时间都是在沟通需求,作为一名技术员,不写代码就感觉是在自废武功,慢慢颓废了很多,今天重新回顾了下JAVA线程知识,基础知识就不梳理了,网上也很多,主要关键几个状态位(新建.可运行.正在运行.阻塞等)和几个关键方法(sleep.yield.wait.notify.notifyAll等)搞清楚,基础应用知识应该了解的就差不多了,想深入了解的推荐看<JAVA并发编程实战>.废话不多说了,直接上例子,看了下网上的大致思路,结合实际应用时的场景,自己编写了一个例子,不到

Java中的生产者、消费者问题

Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库). 其中一个是生产者, 用于将产品放入仓库: 另外一个是消费者, 用于从仓库中取出产品消费. 问题出现在当仓库已经满了, 而此时生产者还想向其中放入一个新的产品的情形, 其解决方法是让生产者此时进行等待, 等待消费者从仓库中取走了一个或者多个产品后再去唤醒它. 同样地, 当仓库已经空了, 而消费者还