最近在整理 Java 的多线程相关的技术,这里备份下关于【 BlockingQueue 】代码。
github:
【 https://github.com/cstriker1407/think_in_java 】
CONTENTS
BlockingQueueTest.java类:
public class BlockingQueueTest
{
public static void test()
{
BlockingQueue<Integer> queue = new LinkedBlockingDeque<Integer>(10);
BlockingQueueProducer p1 = new BlockingQueueProducer(queue, 1);
BlockingQueueConsumer c1 = new BlockingQueueConsumer(queue, 1);
BlockingQueueConsumer c2 = new BlockingQueueConsumer(queue, 2);
p1.start();
c1.start();
c2.start();
}
}
class BlockingQueueProducer extends Thread
{
BlockingQueue<Integer> queue;
int id;
public BlockingQueueProducer(BlockingQueue<Integer> queue, int id)
{
super();
this.queue = queue;
this.id = id;
}
@Override
public void run()
{
for (int i = 0; i < 100; i++)
{
try
{
System.out.println("线程ID:" + id + " 生产num:" + i);
queue.put(i);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class BlockingQueueConsumer extends Thread
{
BlockingQueue<Integer> queue;
int id;
public BlockingQueueConsumer(BlockingQueue<Integer> queue, int id)
{
super();
this.queue = queue;
this.id = id;
}
@Override
public void run()
{
for (int i = 0; i <50; i++)
{
try
{
int num = queue.take();
System.out.println("线程ID:" + id + " 得到的num:" + num);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
部分日志打印:
线程ID:1 生产num:5 线程ID:1 生产num:6 线程ID:1 生产num:7 线程ID:1 生产num:8 线程ID:1 生产num:9 线程ID:1 生产num:10 线程ID:1 生产num:11 线程ID:1 生产num:12 线程ID:1 得到的num:2 线程ID:1 生产num:13 线程ID:2 得到的num:3 线程ID:1 生产num:14 线程ID:1 得到的num:4
备注:
这个例子是用 BlockingQueue 实现的消费者-生产者模型,比较简单。
发表评论