BlockingQueue
解决线程通信的问题
阻塞方法:put、take
生产者消费者模式
生产者:产生数据的线程
消费者:使用数据的线程
实现类
ArrayBlockingQueue
linkedBlockingQueue
ProityBlockingQueue、SynchronousQueue、DelayQueue
样例代码
package com.nowcoder.community;
import org.junit.Test;
import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class BlockingQueueTests {
@Test
public void test() {
BlockingQueue queue=new ArrayBlockingQueue(10);//指定队列存放的数量
new Thread(new producer(queue)).start();//创建生产者线程
new Thread(new Consumer(queue)).start();//创建消费者线程
new Thread(new Consumer(queue)).start();//创建消费者线程
}
}
class producer implements Runnable{
private BlockingQueue queue;
public producer(BlockingQueue queue) {
this.queue = queue;
}
@Override
public void run() {
try {
for(int i=0;i<100;i++){
Thread.sleep(20);
queue.put(i);
System.out.println(Thread.currentThread().getName()+"生产:"+queue.size());
}
}catch (Exception e){
e.printStackTrace();
}
}
}
class Consumer implements Runnable{
private BlockingQueue queue;
public Consumer(BlockingQueue queue) {
this.queue = queue;
}
@Override
public void run() {
try {
while (true){
Thread.sleep(new Random().nextInt(1000));
queue.take();
System.out.println(Thread.currentThread().getName()+"消费:"+queue.size());
}
}catch (Exception e){
e.printStackTrace();
}
}
}
效果:



