生产者和消费者问题是操作系统中关于线程同步非常经典的一个问题,该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。
实现生产者和消费者的代码有很多,本人用Java写了一个非常简单明了的代码,比起长篇大论的容易看懂。。。代码如下
View Code
1 package expert; 2 3 /** 4 * 生产者消费者问题中的读和写的方法要用<b>synchronized</b>来修饰,并且</p> 5 * 读和写的方法要同时作用于一个类的实例对象或者一个变量,其中读和写的方法要</p> 6 * 使用不同的线程来创建 7 * @author pan 8 */ 9 public class 生产者消费者问题 { 10 public int num=10; 11 public synchronized void 生产(){ 12 try { 13 Thread.sleep(1000); 14 num=num+1; 15 System.out.println("生产了一个\t当前数字是:"+num); 16 } catch (InterruptedException e) { 17 e.printStackTrace(); 18 } 19 } 20 public synchronized void 消费(){ 21 if(num>=1){ 22 try { 23 Thread.sleep(1000); 24 num=num-1; 25 System.out.println("消费了一个\t当前数字是:"+num); 26 } catch (InterruptedException e) { 27 // TODO 自动生成的 catch 块 28 e.printStackTrace(); 29 } 30 } 31 } 32 33 public static void main(String[] args) { 34 final 生产者消费者问题 例子=new 生产者消费者问题(); 35 Thread t1=new Thread(){ 36 public void run(){ 37 while(true){ 38 例子.生产(); 39 } 40 } 41 }; 42 Thread t2=new Thread(){ 43 public void run(){ 44 while(true){ 45 例子.消费(); 46 } 47 } 48 }; 49 t1.start(); 50 t2.start(); 51 } 52 53 }
由于Java的编码特点,可以使用汉字来作为类的名字。试运行,其中一种输出结果为:(程序需要手动停下来。。。)
1 生产了一个 当前数字是:11 2 生产了一个 当前数字是:12 3 生产了一个 当前数字是:13 4 消费了一个 当前数字是:12 5 生产了一个 当前数字是:13 6 生产了一个 当前数字是:14 7 生产了一个 当前数字是:15 8 生产了一个 当前数字是:16 9 消费了一个 当前数字是:15 10 生产了一个 当前数字是:16