2015年05月31日 Queue 浏览(56)

Java BlockingDeque解决生产者与消费者问题

BlockingDeque解决生产者与消费者问题的代码如下:

import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
/**
 * @from www.everycoding.com
 * @Description:BlockingDeque解决生产者与消费者问题
 */
class Producer implements Runnable {
	  private String name;

	  private BlockingDeque<Integer> deque;

	  public Producer(String name, BlockingDeque<Integer> deque) {
	    this.name = name;
	    this.deque = deque;
	  }

	  public synchronized void run() {

	    for (int i = 0; i < 10; i++) {
	      try {
	        deque.putFirst(i);
	        System.out.println(name + " 已生产,编号: " + i);
	        Thread.sleep(300);

	      } catch (InterruptedException e) {
	        e.printStackTrace();
	      }
	    }

	  }
	}

	class Consumer implements Runnable {
	  private String name;

	  private BlockingDeque<Integer> deque;

	  public Consumer(String name, BlockingDeque<Integer> deque) {
	    this.name = name;
	    this.deque = deque;
	  }

	  public synchronized void run() {
		  while (true) {
	      try {
	        int j = deque.takeLast();
	        System.out.println(name + " 已消费,编号 " + j);
	        if (j == 8) {
	        	System.out.println("已吃到了编号"+j+"的面包,饱了,后面的不打算吃了,停止消费喽");
	        	break;
	        }
	        Thread.sleep(300);
	      } catch (InterruptedException e) {
	        e.printStackTrace();
	      }
	    }
	  }
	}

	public class BlockingDequeTester {
	  public static void main(String[] args) {
		// 定义队列的长度为3。例如一个碗最多只能放6个面包。如果不吃的话,其他的面包放不进来
	    BlockingDeque<Integer> deque = new LinkedBlockingDeque<Integer>(6);
	    Runnable producer = new Producer("面包", deque);
	    Runnable consumer = new Consumer("面包", deque);
	    // 开始生产面包
	    new Thread(producer).start();
	    try {
	      Thread.sleep(300);
	    } catch (InterruptedException e) {
	      e.printStackTrace();
	    }
	    // 开始消费面包
	    new Thread(consumer).start();
	  }
	}

执行结果如下:

面包 已生产,编号: 0
面包 已生产,编号: 1
面包 已消费,编号 0
面包 已生产,编号: 2
面包 已消费,编号 1
面包 已生产,编号: 3
面包 已消费,编号 2
面包 已生产,编号: 4
面包 已消费,编号 3
面包 已生产,编号: 5
面包 已消费,编号 4
面包 已生产,编号: 6
面包 已消费,编号 5
面包 已生产,编号: 7
面包 已消费,编号 6
面包 已生产,编号: 8
面包 已消费,编号 7
面包 已生产,编号: 9
面包 已消费,编号 8
已吃到了编号8的面包,饱了,后面的不打算吃了,停止消费喽


用户头像