Java线程:并发协作 生产者消费者模型
	
    
    
	对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言一样,Hello World!都是最经典的例子。
  实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了。
  对于此模型,应该明确一下几点:
  1、生产者仅仅在仓储未满时候生产,仓满则停止生产。
  2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。
  3、当消费者发现仓储没产品可消费时候会通知生产者生产。
  4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。
  此模型将要结合java.lang.Object的wait与notify、notifyAll方法来实现以上的需求。这是非常重要的。
   /** 
    * Java线程:并发协作-生产者消费者模型 
    */ 
  public class Test { 
    public static void main(String[] args) { 
      Godown godown = new Godown(30); 
      Consumer c1 = new Consumer(50, godown); 
      Consumer c2 = new Consumer(20, godown); 
      Consumer c3 = new Consumer(30, godown); 
      Producer p1 = new Producer(10, godown); 
      Producer p2 = new Producer(10, godown); 
      Producer p3 = new Producer(10, godown); 
      Producer p4 = new Producer(10, godown); 
      Producer p5 = new Producer(10, godown); 
      Producer p6 = new Producer(10, godown); 
      Producer p7 = new Producer(80, godown); 
      c1.start(); 
      c2.start(); 
      c3.start(); 
      p1.start(); 
      p2.start(); 
      p3.start(); 
      p4.start(); 
      p5.start(); 
      p6.start(); 
      p7.start(); 
    } 
  } 
  /** 
    * 仓库 
    */ 
  class Godown { 
    public static final int max_size = 100; //最大库存量 
    public int curnum; //当前库存量 
    Godown() { 
    } 
    Godown(int curnum) { 
      this.curnum = curnum; 
    } 
  
    /** 
     * 生产指定数量的产品 
     * @param neednum 要生成的产品数量
     */ 
    public synchronized void produce(int neednum) { 
      //测试是否需要生产 
      while (neednum +
    
     
	
	
    
    
	相关文档:
        
    
      最近在开发过程中发现一个问题:Boolean类型的值无法在flex和java间传递,经过一段研究发现,问题出现在Boolean类型的getter和setter方法上。
      按照javabean的规范,小布尔类型的getter是以is做前缀的,但是大布尔类型的getter就成了以get为前缀了(大布尔作为引用类型,已经被视为普通 ......
	
    
        
    
    1.
何时需要重写
equals()
当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。
2.
设计
equals()
[1]
使用
instanceof
操作符检查“实参是否为正确的类型”。
[2]
对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。
[2.1]
对于非
float
和 ......
	
    
        
    
    0 引言
    
从控制台中读取数据是一个比较常用的功能,在 JDK 5.0 以前的版本中的实现是比较复杂的,需要手工处理系统的输入流。有意思的是,从 JDK 5.0 版本开始,能从控制台中输入数据的方法每增加一个版本号,就有一种新增的方法,这也增加了选择的种类,可以依据不同的要求来进行选择。下面来看一下 ......
	
    
        
    
    
1. 创建线程有两种方式:
1)扩展java.lang.Thread类
public class ThreadTest extends Thread{ }
2)实现Runnable接口
public class ThreadTest implements Runnable{ }
2. Thread类代表线程类,有两个最主要的方法:
1)run() 包含线程运行时所执行的代码。
用户的线程类只需要继承Thread类,覆盖Thread类的run( ......