利用BlockingQueue实现生产者消费者问题
BlockingQueue中API介绍
offer(E e): 将给定的元素设置到队列中,如果设置成功返回true, 否则返回false. e的值不能为空,否则抛出空指针异常。
offer(E e, long timeout, TimeUnit unit): 将给定元素在给定的时间内设置到队列中,如果设置成功返回true, 否则返回false.
add(E e): 将给定元素设置到队列中,如果设置成功返回true, 否则抛出异常。如果是往限定了长度的队列中设置值,推荐使用offer()方法。
put(E e): 将元素设置到队列中,如果队列中没有多余的空间,该方法会一直阻塞,直到队列中有多余的空间。
take(): 从队列中获取值,如果队列中没有值,线程会一直阻塞,直到队列中有值,并且该方法取得了该值。
poll(long timeout, TimeUnit unit): 在给定的时间里,从队列中获取值,如果没有取到会抛出异常。
remainingCapacity():获取队列中剩余的空间。
remove(Object o): 从队列中移除指定的值。
contains(Object o): 判断队列中是否拥有该值。
drainTo(Collection c): 将队列中值,全部移除,并发设置到给定的集合中。
消费者
package thread;
import java.util.concurrent.BlockingQueue;
public class Consumer implements Runnable
{
BlockingQueue<String> queue;
public Consumer(BlockingQueue<String> queue)
{
this.queue=queue;
}
@Override
public void run()
{
try
{
String produce=queue.take();
System.out.println("消费者消费了:"+produce);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
生产者
package thread;
import java.util.Date;
import java.util.concurrent.BlockingQueue;
public class Product implements Runnable
{
static int num=0;
BlockingQueue<String> queue;
Date date=new Date();
public Product(BlockingQueue<String> queue)
{
this.queue=queue;
}
@Override
public void run()
{
try
{
String produce="物品"+num ;
num++;
System.out.println("生产者线程"+Thread.currentThread().getName()+produce);
queue.put(produce);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
测试
package thread;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
public class Test
{
public static void main(String[] args)
{
//设仓库大小为4
BlockingQueue<String> queue=new LinkedBlockingDeque<String>(4);
Consumer consumer=new Consumer(queue);
Product product=new Product(queue);
for (int i=0;i<50;i++)
{
new Thread(product,"生产者"+i).start();
new Thread(consumer,"消费者"+i).start();
}
}
}
运行结果
生产者线程生产者0物品0
消费者消费了:物品0
生产者线程生产者1物品1
消费者消费了:物品1
生产者线程生产者2物品2
消费者消费了:物品2
生产者线程生产者3物品3
生产者线程生产者4物品4
消费者消费了:物品3
生产者线程生产者6物品5
生产者线程生产者7物品6
消费者消费了:物品4
生产者线程生产者8物品7
消费者消费了:物品5
生产者线程生产者9物品8
消费者消费了:物品6
生产者线程生产者10物品9
消费者消费了:物品7
生产者线程生产者11物品10
消费者消费了:物品8
生产者线程生产者12物品11
消费者消费了:物品9
生产者线程生产者13物品12
消费者消费了:物品10
生产者线程生产者14物品13
消费者消费了:物品11
生产者线程生产者15物品14
消费者消费了:物品12
生产者线程生产者16物品15
消费者消费了:物品13
生产者线程生产者17物品16
消费者消费了:物品14
生产者线程生产者18物品17
消费者消费了:物品15
生产者线程生产者19物品18
消费者消费了:物品16
生产者线程生产者20物品19
消费者消费了:物品17
生产者线程生产者21物品20
消费者消费了:物品18
生产者线程生产者22物品21
生产者线程生产者23物品22
生产者线程生产者24物品23
消费者消费了:物品19
消费者消费了:物品20
消费者消费了:物品22
消费者消费了:物品21
生产者线程生产者5物品24
消费者消费了:物品24
消费者消费了:物品23
生产者线程生产者48物品26
生产者线程生产者49物品25
消费者消费了:物品26
生产者线程生产者47物品27
消费者消费了:物品25
消费者消费了:物品27
生产者线程生产者46物品28
生产者线程生产者45物品29
消费者消费了:物品29
消费者消费了:物品28
生产者线程生产者44物品30
生产者线程生产者43物品31
生产者线程生产者42物品32
生产者线程生产者41物品33
消费者消费了:物品33
消费者消费了:物品30
生产者线程生产者40物品34
消费者消费了:物品32
消费者消费了:物品34
生产者线程生产者39物品35
消费者消费了:物品31
生产者线程生产者38物品36
生产者线程生产者36物品37
消费者消费了:物品36
生产者线程生产者37物品38
消费者消费了:物品37
生产者线程生产者35物品39
消费者消费了:物品38
消费者消费了:物品35
生产者线程生产者33物品41
消费者消费了:物品39
生产者线程生产者32物品42
生产者线程生产者34物品40
消费者消费了:物品42
生产者线程生产者30物品43
生产者线程生产者29物品44
消费者消费了:物品44
生产者线程生产者28物品45
消费者消费了:物品41
消费者消费了:物品45
消费者消费了:物品43
消费者消费了:物品40
生产者线程生产者27物品49
生产者线程生产者31物品48
消费者消费了:物品49
生产者线程生产者25物品47
消费者消费了:物品48
生产者线程生产者26物品46
消费者消费了:物品47
消费者消费了:物品46