编程题_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 编程题

编程题

 2013/10/9 9:30:11  etoak1210  程序员俱乐部  我要评论(0)
  • 摘要:<divclass="iteye-blog-content-contain"style="font-size:14px">编写一段生产者/消费者的Java代码,其中生产者每次生产1个0到1000之间的随机数,消费者则把该随机数打印出来。如果产生的随机数为0,则生产者、消费者均退出运行。要求生产者、消费者均使用线程来实现。</div><divclass="iteye-blog-content-contain"style="font-size:14px">
  • 标签:
<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>
  • 相关文章
发表评论
用户名: 匿名