多线程(多个生产者多个消费者 JDK5.0版本 Lock接口)

/*
多线程:一个生产者一个消费者
*/
import java.util.concurrent.locks.*;
class Resource
{
private String name;
private int age;
boolean flag=false;
final Lock lock=new ReentrantLock();
final Condition proCondition=lock.newCondition();
final Condition selCondition=lock.newCondition();

public void setResource(String name,int count)
{
lock.lock();
try
{
while(flag)
proCondition.await();
this.name=name+count;
System.out.println(Thread.currentThread().getName()+"生产者"+this.name+"......");
flag=true;
selCondition.signal();
}
catch(InterruptedException ex)
{

}
finally
{
lock.unlock();
}
}
public String getName()
{
lock.lock();
try
{
while(!flag)
selCondition.await();
flag=false;
proCondition.signal();
return this.name;
}
catch(InterruptedException ex)
{

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

class ProducerThread implements Runnable
{
int count=1;
public Resource r=new Resource();
public Resource getResource()
{
return r;
}
public void run()
{
while(true)
{
//try{r.setResource("张三",count);}catch(InterruptedException ex){}
r.setResource("张三",count);
count++;
}
}
}

class SellerThread implements Runnable
{
private Resource r;
int count=20;
public SellerThread(Resource r)
{
this.r=r;
}
public void run()
{
while(true)
System.out.println(Thread.currentThread().getName()+"消费者"+r.getName()+"...");
//try{System.out.println(Thread.currentThread().getName()+"消费者"+r.getName()+"...");}catch(InterruptedException ex){}
}
}
class ManyProducerSellerThread2
{
public static void main(String[] args) throws InterruptedException
{
ProducerThread pt=new ProducerThread();
new Thread(pt).start();
new Thread(pt).start();
new Thread(new SellerThread(pt.getResource())).start();
new Thread(new SellerThread(pt.getResource())).start();
}
}

时间: 2024-11-08 17:00:21

多线程(多个生产者多个消费者 JDK5.0版本 Lock接口)的相关文章

多线程(多个生产者多个消费者)

/*多线程:一个生产者一个消费者*/ class Resource{ private String name; private int age; boolean flag=false; public synchronized void setResource(String name,int count) throws InterruptedException { while(flag) this.wait(); this.name=name+count; System.out.println(T

多线程操作实例——生产者与消费者

面对多线程学习生产者与消费者是最基本的实例 对于java后端开发的人员必须要掌握,还有考研考试计算机操作系统的同鞋. 下面是三个实例对于生产者与消费者的的例子,层层递进,逐步解决问题. 问题:生产者——设置信息名字name,和内容content 消费者——负责取出设置的信息. 一.基本实现 由于线程的不确定性可能出现以下问题: (1)消费者取出的信息不匹配,即不是由同一个生产者设置的信息 (2)生产者生产了多个信息,消费者才开始取出信息,或消费者取出的重复的信息. 上面的问题下面会逐一解决,下面

Linux多线程机制(生产者和消费者实例 )

    使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式.我们知道,在Linux系统下,启动一个新的进程必须分配给它独立 的地址空间,建立众多的数据表来维护它的代码段.堆栈段和数据段,这是一种"昂贵"的多任务工作方式.而运行于一个进程中的多个线程,它们彼此之间使用相 同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要 的时间. 使用多线程的理由之二是线

多线程中的生产者消费者Java源代码(带注释)

同步解决了线程中数据存取不一致的问题,而Object类中的等待与唤醒方法解决了重复存取的问题 以下的生产者消费者Java源代码例子,很好的说明了这一点. 其中包括Info类.Producter类.Consumer类.Test类. <1> Info类如下: 1 package per.producterconsumer; 2 3 public class Info { 4 5 private boolean flag = true; 6 /* 7 * flag=true 表示此时可以生产,但不能

java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现

java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了  wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样,先定义一个缓冲区: public class ValueObject { public static String value = ""; } 换种写法,生产和消费方法放在一个类里面: public class ThreadDomain41 extends ReentrantLock {

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

生产者-消费者问题(Producer-consumer problem),也称作有限缓冲问题(Bounded-buffer problem),是多线程领域的一个经典问题,可以描述为:两个或者更多个线程共享同一个缓冲区,其中一个或多个作为“生产者”会不断地向缓冲区中添加数据,另外的一个或者多个作为“消费者”从缓冲区中取走数据.这个问题的关键在于:要保证缓冲区满了之后“生产者”不能再继续添加数据,而缓冲区空了之后“消费者”不能再取走数据了. 这个问题在多个“生产者”和“消费者”的情况下肯定要麻烦一点

Java多线程14:生产者/消费者模型

什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: 1.生产者生产的时候消费者不能消费 2.消费者消费的时候生产者不能生产 3.缓冲区空时消费者不能消费 4.缓冲区满时生产者不能生产 生产者/模型作为一种重要的模型,它的优点在于: 1.解耦.因为多了一个缓冲区,所以生产者和消费者并不直接相互调用,这一点很容易想到,这样生产者和消费者的代码发生变化,

Java多线程设计模式(2)生产者与消费者模式

1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不匹配. 当要从某个线程Produccer参与者将数据传输给其它线程Consumer参与者的时候,此时就可以在中间加一个Channel参与者,在Channel参与者中以某种方式存放接受的数据,再以某方式来获取收到的数据,Channel就可以来缓存两个线程之间传输的数据,在Channel参与者为了保证安

Java多线程之生产者(Producer)和消费者(Consumer)

Producer生产者顾名思义就是生产数据的线程,Consumer消费者就是使用数据的线程.可以有多个生产者,也可以有多个消费者,当生产者和消费者都是一个的时候,又叫做管道Pipe Pattern. 下面简单写了个例子,一个线程加1,一个线程减1,一个生产者.一个消费者,生产者用来加1,消费者用来减1.下面代码已经验证ok. 1. Info数据对象,用来保存生产者和消费者使用的数据 public class Info { private int count; private boolean fl