使用阻塞队列模拟完成生产者和消费者问题
使用线程池,匿名类和线程安全的集合Queue
public static void main(String[] args) {
//使用阻塞队列模拟完成生产者和消费者问题
ExecutorService es = Executors.newFixedThreadPool(2);
//创建一个固定长度的队列,如果队列已满,则处于阻塞状态,直到有可用空间
BlockingQueue<Integer> bq = new ArrayBlockingQueue<Integer>(1);
es.submit(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
//将指定元素插入此队列中,如果没有可用空间,则等待。
bq.put(i);
System.out.println(Thread.currentThread().getName()+"生产了-->"+i);
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
es.submit(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
//获取并移除此队列头部元素,如果没有可用元素,则等待。
Integer n = bq.take();
System.out.println(Thread.currentThread().getName()+"消费了-->"+n);
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
es.shutdown();
}
打印结果:
pool-1-thread-1生产了–>0
pool-1-thread-2消费了–>0
pool-1-thread-1生产了–>1
pool-1-thread-2消费了–>1
pool-1-thread-1生产了–>2
pool-1-thread-2消费了–>2
pool-1-thread-1生产了–>3
pool-1-thread-2消费了–>3
pool-1-thread-1生产了–>4
pool-1-thread-2消费了–>4
pool-1-thread-1生产了–>5
pool-1-thread-2消费了–>5
pool-1-thread-1生产了–>6
pool-1-thread-2消费了–>6
pool-1-thread-1生产了–>7
pool-1-thread-2消费了–>7
pool-1-thread-1生产了–>8
pool-1-thread-2消费了–>8
pool-1-thread-1生产了–>9
pool-1-thread-2消费了–>9