利用阻塞队列实现生产者、消费者模型的实例
package com.etc.test;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* 利用阻塞队列实现生产者、消费者模型的实例
* @author xiangrian
*/
public class TestBlockingQueue {
//设置缓冲区最多可存放3个数据
final static BlockingQueue<String> bliocking=new ArrayBlockingQueue<String>(3);
public static void main(String[] args) {
for(int i=1;i<=2;i++){//启动两个存放数据的线程,使用阻塞队列的作用更明显
putdata pd=new putdata();
pd.start();
}
takedata ta=new takedata();
ta.start();
}
}
//定义一个线程实现不停往缓冲区存放数据(相当于生产者)
class putdata extends Thread{
public void run() {
while(true){
try {
Thread.sleep((long) (Math.random() * 1000));
System.out.println(Thread.currentThread().getName()+"正准备存放数据"+(TestBlockingQueue.bliocking.size()== 3 ?"队列容量已满,正在等待" : "……"));
TestBlockingQueue.bliocking.put("数据");
System.out.println(Thread.currentThread().getName()
+ "存入数据," + "队列目前有" + TestBlockingQueue.bliocking.size()
+ "个数据");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//定义一个线程实现不停的往缓冲区取出数据(相当于消费者)
class takedata extends Thread{
public void run() {
while(true){
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"正准备取出数据"+(TestBlockingQueue.bliocking.size()==0?"队列容量为空,正在等待":"……"));
TestBlockingQueue.bliocking.take();
System.out.println(Thread.currentThread().getName()
+ "存入数据," + "队列目前有" + TestBlockingQueue.bliocking.size()
+ "个数据");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* 利用阻塞队列实现生产者、消费者模型的实例
* @author xiangrian
*/
public class TestBlockingQueue {
//设置缓冲区最多可存放3个数据
final static BlockingQueue<String> bliocking=new ArrayBlockingQueue<String>(3);
public static void main(String[] args) {
for(int i=1;i<=2;i++){//启动两个存放数据的线程,使用阻塞队列的作用更明显
putdata pd=new putdata();
pd.start();
}
takedata ta=new takedata();
ta.start();
}
}
//定义一个线程实现不停往缓冲区存放数据(相当于生产者)
class putdata extends Thread{
public void run() {
while(true){
try {
Thread.sleep((long) (Math.random() * 1000));
System.out.println(Thread.currentThread().getName()+"正准备存放数据"+(TestBlockingQueue.bliocking.size()== 3 ?"队列容量已满,正在等待" : "……"));
TestBlockingQueue.bliocking.put("数据");
System.out.println(Thread.currentThread().getName()
+ "存入数据," + "队列目前有" + TestBlockingQueue.bliocking.size()
+ "个数据");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//定义一个线程实现不停的往缓冲区取出数据(相当于消费者)
class takedata extends Thread{
public void run() {
while(true){
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"正准备取出数据"+(TestBlockingQueue.bliocking.size()==0?"队列容量为空,正在等待":"……"));
TestBlockingQueue.bliocking.take();
System.out.println(Thread.currentThread().getName()
+ "存入数据," + "队列目前有" + TestBlockingQueue.bliocking.size()
+ "个数据");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
效果显示: