生产者与消费者模式
- 直接上代码
public class StoreHouse
{
private int capacity;
private AtomicInteger size = new AtomicInteger(0);
private BlockingQueue<Integer> queue;
public StoreHouse(int capacity)
{
this.capacity = capacity;
queue = new ArrayBlockingQueue<>(capacity);
}
public void producer(int productId)
{
try
{
queue.put(productId);
} catch (InterruptedException e)
{
e.printStackTrace();
}
size.incrementAndGet();
System.out.println("生成了产品"+productId);
}
public void consumer()
{
int productId = 0;
try
{
productId = queue.take();
} catch (InterruptedException e)
{
e.printStackTrace();
}
size.decrementAndGet();
System.out.println("当前总产品数:"+size+",消费了产品:"+productId);
}
public static void main(String[] args)
{
StoreHouse storehouse = new StoreHouse(16);
new Thread(new ProducerRunnable(storehouse)).start();
new Thread(new ConsumerRunnable(storehouse)).start();
}
}
class ProducerRunnable implements Runnable
{
// 所在放置的仓库
private StoreHouse storehouse;
public ProducerRunnable(StoreHouse storehouse)
{
this.storehouse = storehouse;
}
@Override
public void run()
{
while (true)
{
try
{
Thread.sleep(100);
} catch (InterruptedException e)
{
e.printStackTrace();
}
int productId = new Random().nextInt(100);
storehouse.producer(productId);
}
}
}
class ConsumerRunnable implements Runnable
{
// 所在放置的仓库
private StoreHouse storehouse;
public ConsumerRunnable(StoreHouse storehouse)
{
this.storehouse = storehouse;
}
@Override
public void run()
{
while(true)
{
try
{
Thread.sleep(200);
} catch (InterruptedException e)
{
e.printStackTrace();
}
storehouse.consumer();
}
}
}
2.总结:a.多个操作方法(生成/消费)最好放在同一个操作类里面,便于同步使用
b.阻塞同步队列可实现消息通知