多线程遇到的问题(一个生产者一个消费者)

/*
多线程:一个生产者一个消费者
*/

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.wait();this.notify();System.out.println("生产者while continue");}
this.name=name+count;
System.out.println("生产者"+this.name+"......");
flag=true;
//this.notify();

}
public synchronized String getName()throws InterruptedException
{
while(!flag)
//this.wait();
{this.wait();this.notify();System.out.println("消费者while continue");}
flag=false;
//this.notify();
return this.name;
}
}

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){}
count++;
}
}
}

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

时间: 2024-10-06 20:22:16

多线程遇到的问题(一个生产者一个消费者)的相关文章

多线程-线程间通信-多生产者多消费者示例

1.多线程-线程间通信-多生产者多消费者问题 多生产者和多消费者.等待唤醒机制. 产生了两个问题: 1.出现了多次连续生产,未消费,或者一个商品被消费多次. 解决:必须要--------每一个被唤醒的线程判断一次标记,所以将if判断改为while判断. 2.出现了死锁. 本方唤醒了本方,导致了所有的线程都等待了. 解决方式就是:唤醒所有等待的线程.这样既唤醒了本方也唤醒对方. 虽然解决了多生产消费的问题,但是有些低效. 解决方法一: 唤醒所有等待的线程 class Resource{     p

多线程学习笔记五-------------多生产者多消费者问题

线程通信--多生产者多消费者问题 多生产者,多消费者会导致线程死锁的情况. public class RoastDuck { public static void main(String[] args) { Duck d = new Duck(); ProductProcess pp = new ProductProcess(d); ProductProcess pp0 = new ProductProcess(d); ConsumeProcess cp = new ConsumeProcess

java 中多线程之间的通讯之生产者和消费者 (多个线程之间的通讯)

在真实开发 中关于多线程的通讯的问题用到下边的例子是比较多的 不同的地方时if 和while 的区别 如果只是两个线程之间的通讯,使用if是没有问题的. 但是在多个线程之间就会有问题 1 /* 2 * 这个例子用来解释多个生产者和多个消费者的情况 3 */ 4 5 /* 6 * 资源库 7 */ 8 class Resource 9 { 10 private String name; 11 private int count = 1; 12 private boolean flag = fals

Java多线程虚假唤醒问题(生产者和消费者关系)

何为虚假唤醒: 当一个条件满足时,很多线程都被唤醒了,但是只有其中部分是有用的唤醒,其它的唤醒都是无用功:比如买货:如果商品本来没有货物,突然进了一件商品,这是所有的线程都被唤醒了,但是只能一个人买,所以其他人都是假唤醒,获取不到对象的锁: 避免虚假唤醒: 避免虚假唤醒的示例:这里使用了 Lambda 表达式 package com.jia.pc; public class A { public static void main(String[] args) { Data data = new

多线程简单实例(2)生产者和消费者

这是一个生产者和消费者的例子.消费者从仓库取物品,生产者向仓库增加商品. 当商品说达到最大时,不能继续增加商品,应该通知其他线程去取商品. 同样,当仓库商品为空时,无法取商品,而是通知其他线程增加商品. 这里用到线程的两个常用的方法:notifyAll和wait方法. package code.thread; //Product and Custom public class ProAndCus { public static void main(String[] args) { Store s

生产者与消费者案例-虚假唤醒

以下是一个案例,有一个店员,负责进货和卖货.进货生产,卖货消费. 当商品超过10件,生产等待,消费继续,当少于0件,消费等待,消费继续. 正常代码如下: package com.atguigu.juc; /* * 生产者和消费者案例 */ public class TestProductorAndConsumer { public static void main(String[] args) { Clerk clerk = new Clerk(); Productor pro = new Pr

浅谈Java简单实现的生产者与消费者问题

一.面对生产者和消费者的问题,首先我们得明白几点: 生产者:生产数据:消费者:消费数据.消费者在没有数据可供消费的情况下,不能消费:生产者在原数据没有被消费掉的情况下,不能生产新数据.假设,数据空间只有一个.实际上,如果实现了正确的生产和消费,则,两个线程应该是严格的交替执行. synchronized关键字若用在代码中,形成一个同步块,且,必须要执行锁:    synchronized (锁对象) {        同步块    }同步块使得锁对象称为thread monitor二.代码实现:

Kafka-常用术语(消息、生产者、消费者、集群、broker解释)

Kafka-常用术语(消息.生产者.消费者.集群.broker解释) 消息和批次 kafka的数据单元被称为消息.类似于数据库表中的一行数据. 消息由字节数组组成,所以对于kafka来说,消息里的数据没有特别的格式或含义. 消息可以有一个可选的元数据,也就是键,键也是一个字节数组,当消息以一种可控的方式写入不同的分区时,会用到键.最简单的例子就是为键生成一个一致性散列值,然后使用散列值对主题分区数进行取模,为消息选取分区.这样可以保证具有相同键的消息总是被写到相同的分区上. 为了提高效率,消息被

Linux组件封装(五)一个生产者消费者问题示例

生产者消费者问题是计算机中一类重要的模型,主要描述的是:生产者往缓冲区中放入产品.消费者取走产品.生产者和消费者指的可以是线程也可以是进程. 生产者消费者问题的难点在于: 为了缓冲区数据的安全性,一次只允许一个线程进入缓冲区,它就是所谓的临界资源. 生产者往缓冲区放物品时,如果缓冲区已满,那么需要等待,一直到消费者取走产品为止. 消费者取走产品时,如果没有物品,需要等待,一直到有生产者放入为止. 第一个问题属于互斥问题,我们需要使用一把互斥锁,来实现对缓冲区的安全访问. 后两个属于同步问题,两类