别人说的几句废话,拿来充充场面,哈哈,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 我是生产者我准备生产