1. 简介
Java5提供了一个BlockingQueue接口,主要用途是作为线程同步的工具。
特征:当生产者线程试图向BlockingQueue中放入元素,如果该队列已满,则该线程被阻塞;当消费者线程试图从BlockingQueue中取出元素时,如果该队列已空,则该线程被阻塞。
2. 使用案例
Producer源码
package com.threadtest.queue;
import java.util.concurrent.BlockingQueue;
public class Producer extends Thread {
private BlockingQueue<String> bq;
public Producer(BlockingQueue<String> bq, String name) {
super(name);
this.bq = bq;
}
@Override
public void run() {
String[] strarray = {"JAVA", "Spring", "Mybatis"};
for(int i=0; i<1000; i++) {
try {
Thread.sleep(200);
String str = strarray[i % 3];
bq.put(str);
System.out.println(String.format("生产者\"%s\" 生产了字符:%s", Thread.currentThread().getName(), str));
} catch (InterruptedException e) {
}
}
}
}
Consumer源码
package com.threadtest.queue;
import java.util.concurrent.BlockingQueue;
public class Consumer extends Thread {
private BlockingQueue<String> bq;
public Consumer(BlockingQueue<String> bq, String name) {
super(name);
this.bq = bq;
}
@Override
public void run() {
while(true) {
try {
Thread.sleep(2000);
String str = bq.take();
System.out.println(String.format("消费者\"%s\" 消费了字符: %s", Thread.currentThread().getName(), str));
} catch (InterruptedException e) {
}
}
}
}
队列执行类
package com.threadtest.queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class QueueTest {
public static void main(String[] args) {
BlockingQueue<String> bQueue = new ArrayBlockingQueue(1);
new Producer(bQueue, "生产线程1").start();
new Producer(bQueue, "生产线程2").start();
new Producer(bQueue, "生产线程3").start();
new Consumer(bQueue, "消费线程").start();
}
}
网友评论