生产者与消费者多线程实现,首先的问题就是同步,就是关于临界资源的访问

我们首先来定义一个临界资源类,这里设为Q

class Q

{ int z=4;

}

这个int型的z就是我假设的临界资源的个数

然后是生产者的put动作

synchronized void put()

{

if(z>0)//当临界资源的个数大于0时,生产者等待wait,否则,生产者进行生产,生产之后唤醒notifyAll()挂起的消费者

{

try{wait();}catch(Exception e){}

}

else

{

System.out.print(Thread.currentThread()+"   ");

System.out.println(++z);

try{notifyAll();}catch(Exception e){}

}

}

然后是消费者进行消费的过程get

synchronized void get()

{

if(z<=0)//当临界资源的个数等于或者小于0时,消费者进程等待

{

try{wait();}catch(Exception e){}

}

else

{

System.out.print(Thread.currentThread().getName()+"   ");

System.out.println(z--);

if(z==0)//当一个消费者消费完之后检查了一下临界资源,发现资源为0,那么唤醒生产者来进行生产

{

notify();

}

}

}

然后是生产者和消费者类的定义

这里的生产者和消费者都是Thread类的子类,故都要完成run方法,这里run方法一般为无限循环

class producer extends Thread

{

Q q;

public producer(Q q)

{

this.q=q;

}

public void run()

{

while(true)

{

q.put();

}

}

}

class consumer extends Thread

{

Q q;

public  consumer(Q q)

{

this.q=q;

}

public void run()

{

while(true)

{

q.get();

}

}

}

这里需要注意,因为只能生产一个临界资源对象,这里我们放在主函数里面,所以,需要构造生产者和消费者的构造函数,并将临界资源作为参数传递进来,进行put与get操作

整个函数定义如下:

public class a

{

public static void main(String[]args)

{    Q q=new Q();

Thread t1,t2,t3;

t1=new producer(q);

t2=new consumer(q);

t3=new consumer(q);

t1.start();

t2.start();

t3.start();

}

}

class Q

{

int z=4;

synchronized void put()

{

if(z>0)

{

try{wait();}catch(Exception e){}

}

else

{

System.out.print(Thread.currentThread()+"   ");

System.out.println(++z);

try{notifyAll();}catch(Exception e){}

}

}

synchronized void get()

{

if(z<=0)

{

try{wait();}catch(Exception e){}

}

else

{

System.out.print(Thread.currentThread().getName()+"   ");

System.out.println(z--);

if(z==0)

{

notify();

}

}

}

}

class producer extends Thread

{

Q q;

public producer(Q q)

{

this.q=q;

}

public void run()

{

while(true)

{

q.put();

}

}

}

class consumer extends Thread

{

Q q;

public  consumer(Q q)

{

this.q=q;

}

public void run()

{

while(true)

{

q.get();

}

}

}

java多线程生产者与消费者问题_java多线程实现生产者与消费者问题相关推荐

  1. java多线程生产者与消费者问题_Java多线程详解之四:生产者消费者问题

    一.问题描述 生产者消费者问题(Producer-Consumer problem),也称有限缓冲区问题(Bounded-buffer promblem),是一个多线程同步问题的经典案例.对于一个固定 ...

  2. java不同进程的相互唤醒_Java多线程(二)同步与等待唤醒

    1:数据安全问题 1.1:什么情况下会出现数据安全问题? 多个线程对同一个资源进行操作,并且操作资源的语句有多条.那么这个时候这些语句因为cpu的随机性,有可能被多个线程分开执行.导致数据安全问题. ...

  3. java调用kafka接口发送数据_Java调用Kafka生产者,消费者Api及相关配置说明

    本次的记录内容包括: 1.Java调用生产者APi流程 2.Kafka生产者Api的使用及说明 3.Kafka消费者Api的使用及说明 4.Kafka消费者自动提交Offset和手动提交Offset ...

  4. Java中Thread中的实例方法_Java多线程2:Thread中的实例方法

    Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...

  5. JAVA所有选手就位后比赛开始_Java多线程-CountDownLatch、CyclicBarrier、Semaphore

    上次简单了解了多线程中锁的类型,今天要简单了解下多线程并发控制的一些工具类了. 1. 概念说明: CountDownLatch:相当于一个待执行线程计数器,当计数减为零时表示所有待执行线程都已执行完毕 ...

  6. java多线程间的通信传值_Java 多线程之间的通信

    一个线程送水,一个线程出水:多个线程操作同一个资源,但操作的动作不同.两个线程操作同一资源,但操作的动作不一样.两个方法 packagecn.itcast.day5.thread;//一进一出 pub ...

  7. java线程的创建与执行_Java多线程的创建和运行

    1.多线程的好处 多线程是一个很有用的东西,它使的系统可以同时运行多个任务,提高程序的执行效率.大家平时可能没有注意到,其实我们电脑能同时执行多个程序的基本原理就是多线程. 每一个程序都是一个进程,而 ...

  8. java生产者消费者代码_Java实现Kafka生产者消费者代码实例

    Kafka的结构与RabbitMQ类似,消息生产者向Kafka服务器发送消息,Kafka接收消息后,再投递给消费者. 生产者的消费会被发送到Topic中,Topic中保存着各类数据,每一条数据都使用键 ...

  9. java线程初始方法三种_Java 多线程 三种实现方式

    Java多线程实现方式主要有三种:继承Thread类.实现Runnable接 口.使用ExecutorService.Callable 实现有返回结果的多线程.其中前两种方式线程执行完后都没有返回值, ...

最新文章

  1. php中年月日用什么参数,PHP中date()日期函数参数整理
  2. linux 批量重命名文件
  3. Ril分析五——ril学习总结
  4. BTree C 语言实例
  5. 【机器学习】 树的剪枝策略
  6. AE中获得datalayer所对应的data的文件路径和文件名
  7. ueditor 编辑器再thinkphp中使用 解决转义问题
  8. NOIP2018洛谷P5021:修建赛道
  9. [jQuery] 判断复选框checkbox是否选中checked
  10. 高斯消元法的c语言编程,列主元高斯消元法的C语言编程
  11. sort()基本用法
  12. php动态增加div,JavaScript动态创建div等元素实例
  13. 用幂次变换来增强图像matlab,基于幂次变换及MSR光照不均图像增强.doc
  14. 自动生成_橙瓜码字小说自动生成器,对话描写,景物描写,外貌描写自动生成...
  15. java在线编译器手机版,java编译器手机版下载
  16. python高琦_张永伟:语文辞书在异形词规范中的作用——以含有非规范汉字的异形词处理为例...
  17. c1语言实验报告怎么写,c语言程序设计实验报告模板
  18. 华云数字实名认证图片_“云联盟华云数字”是云数贸传销组织衍生平台!不要被骗了...
  19. java中nextToken,Java StringTokenizer nextToken()用法及代碼示例
  20. 疫情“放大”了无人配送的价值

热门文章

  1. Swift 十进制二进制转换 (How to convert a decimal number to binary in Swift)
  2. java 拦截器响应中取所有参数,spring boot拦截器中获取request post请求中的参数
  3. iis php json文件,配置iis支持.json格式的文件
  4. l298n电机哪一端为正_一文详解电机倒顺开关接法!
  5. 【Python学习教程】:装饰器的详细教程,通俗易懂
  6. Python中经典类和新式类的区别
  7. Python组织文件 实践:查找大文件、 用Mb、kb显示文件尺寸 、计算程序运行时间
  8. linux提高nand速度,linux-2.6.31.1内核支持Nand Flash
  9. python 网络编程 问题记录
  10. python matplotlib.pyplot中的.plot()和.scatter()以及.subplot()和.add_axes()区别