别人说的几句废话,拿来充充场面,哈哈,Java 5以前实现同步存取时,能够使用普通的一个集合,而后在使用线程的协做和线程同步能够实现生产者,消费者模式,主要的技术就是用好,wait ,notify,notifyAll,sychronized这些关键字。而在java 5以后,能够使用组阻塞队列来实现,此方式大大简少了代码量,使得多线程编程更加容易,安全方面也有保障。 java
BlockingQueue接口是Queue的子接口,它的主要用途并非做为容器,而是做为线程同步的的工具,所以他具备一个很明显的特性,当生产者线程试图向BlockingQueue放入元素时,若是队列已满,则线程被阻塞,当消... 编程
消费者代码 安全
import java.util.concurrent.BlockingQueue; 多线程
/** * 消费者 * * @author lianghao * */ public class Consumer extends Thread { private BlockingQueue<Integer> bq; 工具
public Consumer(BlockingQueue bq) { this.bq = bq; } this
/** * 业务执行方法 */ public void run() { while (true) { System.out.println("我消费了一个" + bq.poll()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } 线程
生产者代码 code
/** * 生产者 * @author lianghao * */ public class Producer extends Thread{ private BlockingQueue<Integer> bq; public Producer(BlockingQueue bq) { this.bq = bq; } /** * 业务执行方法 */ public void run() { for(int i=0;i<100;i++){ System.out.println("我是生产者我准备生产"); bq.add(i); System.out.println("我生产了一个"+i); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
测式代码 接口
public class MainTest { public static void main(String[] args) { BlockingQueue<Integer> bq = new ArrayBlockingQueue<>(100); new Producer(bq).start(); new Consumer(bq).start(); } }
运行结果以下 队列
我是生产者我准备生产 我消费了一个null 我生产了一个0 我是生产者我准备生产 我消费了一个0 我生产了一个1 我是生产者我准备生产 我消费了一个1 我生产了一个2 我是生产者我准备生产 我消费了一个2 我生产了一个3 我是生产者我准备生产 我消费了一个3 我生产了一个4 我是生产者我准备生产 我消费了一个4 我生产了一个5 我是生产者我准备生产 我消费了一个5 我生产了一个6 我是生产者我准备生产 我消费了一个6 我生产了一个7 我是生产者我准备生产