别人说的几句废话,拿来充充场面,哈哈,Java 5之前实现同步存取时,可以使用普通的一个集合,然后在使用线程的协作和线程同步可以实现生产者,消费者模式,主要的技术就是用好,wait ,notify,notifyAll,sychronized这些关键字。而在java 5之后,可以使用组阻塞队列来实现,此方式大大简少了代码量,使得多线程编程更加容易,安全方面也有保障。
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; }
/** * 业务执行方法 */ public void run() { while (true) { System.out.println("我消费了一个" + bq.poll()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
生产者代码
/**
* 生产者
* @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
我是生产者我准备生产