`
阅读更多
<div class="iteye-blog-content-contain" style="font-size: 14px">编写一段生产者/消费者的Java代码,其中生产者每次生产1个0到1000之间的随机数,消费者则把该随机数打印出来。如果产生的随机数为0,则生产者、消费者均退出运行。要求生产者、消费者均使用线程来实现。</div>
<div class="iteye-blog-content-contain" style="font-size: 14px">/*@src  http://eric-619.iteye.com/blog/693681
* 生产者消费者问题其含义就是先生产出了产品,才能拉出去让消费者购买
* 一、重点:
*    1、多个线程数据共享区域化思想!---源于多线程的近亲思想!!(类似于静态变量的改变)
*    (如栈内存和对内存,还有当做栈内存和堆内存,如数组和基本数据类型,只要是访问的同一个。)
*    2、生产者消费者
*    
* 二、synchronized加锁:

*/ 
 
 
public class ProCon{ //主方法 
 
public static void main(String[] args){ 
SyncStack stack = new SyncStack(); 
Consumer p = new Consumer(stack); 
Producer c = new Producer(stack); 
 
 
new Thread(p).start(); 
new Thread(c).start(); 


 
class Producer implements Runnable{   //生产者 
    private SyncStack stack; 
 
    public Producer(SyncStack stack){ 
    this.stack = stack; 
     } 
 
    public void run(){ 
    for (int i = 0; i < stack.pro().length; i++){ 
    String product = "产品"+i; 
    stack.push(product); 
    System.out.println("生产了: "+product); 
    try{ 
     Thread.sleep(200); 
     }catch(InterruptedException e) 
      { 
       e.printStackTrace(); 
     } 
   } 


 
class Consumer implements Runnable{   //消费者 
   private SyncStack stack; 
 
   public Consumer(SyncStack stack) { 
   this.stack = stack; 
    } 
    
   public void run(){ 
   for(int i = 0; i < stack.pro().length; i++){ 
    String product = stack.pop(); 
    System.out.println("消费了: "+product); 
    try{ 
     Thread.sleep(1000); 
   }catch(InterruptedException e){ 
     e.printStackTrace(); 
     } 
    } 
   } 

 
class SyncStack{   // 此类是(本质上:共同访问的)共享数据区域 
private String[] str = new String[10]; 
    private int index; 
     
    public synchronized void push(String sst){ //供生产者调用 
    if(index == sst.length()){ 
     try{ 
      wait(); 
     }catch(InterruptedException e){ 
       e.printStackTrace(); 
      } 
    } 
   this.notify(); //唤醒在此对象监视器上等待的单个线程 
   str[index] = sst; 
   index++; 

 
   public synchronized String pop(){   //供消费者调用 
    if(index == 0){ 
     try{ 
      wait(); 
      }catch (InterruptedException e){ 
       e.printStackTrace(); 
      } 
   } 
    notify(); 
    index--; 
    String product = str[index]; 
    return product; 
   } 
 
    public String[] pro(){ //就是定义一个返回值为数组的方法,返回的是一个String[]引用 
     return str;   //这是一个String[]引用 
   } 
}  </div>
分享到:
评论

相关推荐

    蓝桥杯scratch图形化比赛训练编程题源程序88个

    蓝桥杯scratch图形化比赛训练编程题源程序88个蓝桥杯scratch图形化比赛训练编程题源程序88个蓝桥杯scratch图形化比赛训练编程题源程序88个蓝桥杯scratch图形化比赛训练编程题源程序88个蓝桥杯scratch图形化比赛训练...

    最新JAVA编程题全集 50题及答案

    最新 JAVA 编程题全集 50 题及答案 JAVA 是一种广泛使用的编程语言,具有跨平台、面向对象、简单易学等特点。本资源汇集了 50 个 JAVA 编程题目,涵盖了 JAVA 基础知识、数据结构、算法、面向对象编程等方面的内容...

    JAVA编程题全集(100题及答案)

    ### JAVA编程题全集知识点详解 #### 题目一:屏幕输出“你好!” - **知识点概述**:本题目主要考察的是Java的基本语法结构,包括如何定义一个类、类中的主方法`main`以及如何使用`System.out.print()`或`System....

    计算机C语言编程题库(100题)

    本题库共包含100道C语言编程题目,涵盖了各种类型的编程题,包括数组、函数、字符串处理等。下面是对每道题的详细解释和知识点总结: 第1题 函数fun的功能是将低于平均分的人作为函数值返回,将低于平均分的分数...

    JAVA编程题全集(100题及答案)——直接打印

    JAVA 编程题全集知识点总结 本资源提供了一个完整的 JAVA 编程题全集,涵盖了大量的题目和经典的解法,非常适合刷学完基础、刷题前的知识总结与开拓。以下是从资源中提取的重要知识点: 1. JAVA 基础知识:资源中...

    模式分类(第二版)第二章课后编程题

    课后编程题是巩固理论知识和实践技能的重要环节。下面,我们将详细探讨第二章课后编程题可能涵盖的知识点以及解题思路。 1. 统计基础:编程题可能涉及到统计学的基本概念,如均值、方差、标准差等统计量的计算,...

    50道Java常见编程题(有精力的同学看看).rar

    这份"50道Java常见编程题(有精力的同学看看).rar"压缩包文件提供了学习者一个宝贵的资源,涵盖了Java的基础编程练习,旨在帮助他们巩固基础知识并提升编程技能。 在Java的世界里,面向对象编程(Object-Oriented ...

    数据结构18道必做编程题

    这18道必做编程题涵盖了数据结构的主要类型和操作,包括数组、链表、栈、队列、树、图等,旨在帮助你深入理解和应用这些概念。 1. **数组**:数组是最基本的数据结构,用于存储同类型的元素序列。编程题可能涉及...

    C primer plus 编程题答案

    【C Primer Plus 编程题答案】涉及到C语言的基础编程概念和控制语句,包括数组、循环、嵌套循环、用户输入以及字符处理等。以下是对这些知识点的详细解释: 1. **数组**:在C语言中,数组是一种数据结构,可以存储...

    JAVA语言程序设计基础篇编程题答案

    在JAVA语言程序设计基础篇中,编程题是学习过程中至关重要的一环。这些题目旨在帮助初学者巩固基础知识,理解和掌握JAVA编程的基本概念、语法结构以及常用数据类型和控制结构。本资料集包含了对这些基础编程题目的...

    最新JAVA编程题全集(包答案)

    这份"最新JAVA编程题全集(包答案)"显然是一份极佳的学习资源,涵盖了广泛的Java编程概念和技术。让我们深入探讨一下这个压缩包可能包含的知识点。 1. **基础语法**:题目可能会涵盖基本的Java语法,如变量声明、...

    华为DatacomIE编程题 思路脑图

    本主题聚焦于“华为DatacomIE编程题 思路脑图”,这是一个帮助学习者理解和掌握华为网络设备编程的重要资源。虽然描述中提到这个脑图仅包含思路而无具体的命令,但对于准备华为DatacomIE认证考试或提升网络编程技能...

    第十届蓝桥杯大赛青少年创意编程Scratch组国赛编程题.zip

    《第十届蓝桥杯大赛青少年创意编程Scratch组国赛编程题》是一个针对青少年编程爱好者的重要赛事资源包,其中包含了历年来蓝桥杯大赛Scratch组的国赛编程题目。Scratch是麻省理工学院(MIT)媒体实验室“终身幼儿园...

    Java经典编程题汇总

    Java作为一门广泛使用的编程语言,其经典编程题的掌握对于开发者来说至关重要,无论是为了日常工作中的问题解决,还是准备面试,都是提升自身技能的有效途径。这个压缩包“Java经典编程题汇总”显然是一份宝贵的资源...

    java语言设计-基础篇 (第八版)第四章编程题答案

    在本资源中,我们聚焦于Java语言设计的基础篇——第八版的第四章编程题解答。这一部分的内容旨在帮助读者深入理解和应用Java编程的基本概念。Java作为一种广泛应用的面向对象的编程语言,其基础知识对于任何想从事...

    c语言编程题及参考源程序

    《C语言编程题及参考源程序》 C语言是一种强大的、通用的编程语言,它以其简洁的语法和高效的性能在编程领域占据着重要的位置。本资料包“c语言编程题及参考源程序”旨在帮助学习者提升C语言编程技能,通过一系列的...

    java语言程序设计课后编程题答案答案

    本资源“java语言程序设计课后编程题答案答案”聚焦于Java编程的基础篇,提供了课后练习题的解决方案,帮助学习者巩固所学知识,提升编程技能。 Java编程题通常涵盖以下几个核心领域: 1. **基本语法**:包括变量...

    JAVA编程题全集(100题).doc

    Java 编程题全集(100 题) 本资源摘要信息涵盖了 Java 编程的基础语法、线程练习和经典编程程序,涵盖了字符串拼接、类的创建、线程练习、经典编程程序等多方面的知识点。 基础语法 1. Java 程序设计总复习题 1:...

    C++经典编程题

    C++经典编程题;C++经典编程题;C++经典编程题;C++经典编程题

    C++趣味编程题(含答案).doc

    《C++趣味编程题》是一份集合了多个有趣编程挑战的文档,主要针对C++语言进行设计。这些题目旨在帮助学习者提升C++编程技能,同时增加编程的乐趣。本题库涵盖不同难度级别的问题,适合不同程度的C++学习者。 在提供...

Global site tag (gtag.js) - Google Analytics