生产者消费者的核心是不共享内存缓冲区,这里用BlockingQueue当作缓冲区,生产者将提交用户请求,提取用户任务,并装入内存缓冲区
消费者在内存缓冲区中提取并处理任务。
任务:
public final class PcData
{
private final int intData;
public PcData(int d)
{
intData = d;
}
public int getData()
{
return intData;
}
@Override
public String toString()
{
return "PcData [intData=" + intData + "]";
}
}
生产者:
public class Producer implements Runnable
{
private volatile boolean isRunning = true;
private BlockingQueue<PcData> queue;
private static AtomicInteger count = new AtomicInteger();
private static final int SLEEPTIME = 1000;
public Producer(BlockingQueue<PcData> queue2)
{
this.queue = queue2;
}
@Override
public void run()
{
PcData data = null;
Random random = new Random();
System.out.println("start producer id = " + Thread.currentThread().getId());
try
{
while(isRunning)
{
Thread.sleep(random.nextInt(SLEEPTIME));
data = new PcData(count.incrementAndGet());
System.out.println(data + " is put into queue");
if(!queue.offer(data, 2, TimeUnit.SECONDS))
{
System.out.println("failed to put data: " + data);
}
}
}
catch(Exception e)
{
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
public void stop()
{
isRunning = false;
}
}
消费者:
public class Consumer implements Runnable
{
private BlockingQueue<PcData> queue;
private static final int SLEEPTIME = 1000;
public Consumer(BlockingQueue<PcData> queue2)
{
this.queue = queue2;
}
@Override
public void run()
{
// TODO 自动生成的方法存根
System.out.println("start Cosumer id = " + Thread.currentThread().getId());
Random random = new Random();
try
{
while(true)
{
PcData data = queue.take();
if(null != data)
{
int re = data.getData() * data.getData();
System.out.println(MessageFormat.format("{0}*{1}={2}", data.getData(),
data.getData(), re));
Thread.sleep(random.nextInt(SLEEPTIME));
}
}
}
catch(Exception e)
{
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}
客户:
public class Main
{
public static void main(String[] args) throws InterruptedException
{
BlockingQueue<PcData> queue = new LinkedBlockingQueue<PcData>(10);
Producer producer1 = new Producer(queue);
Producer producer2 = new Producer(queue);
Producer producer3 = new Producer(queue);
Consumer consumer1 = new Consumer(queue);
Consumer consumer2 = new Consumer(queue);
Consumer consumer3 = new Consumer(queue);
ExecutorService service = Executors.newCachedThreadPool();
service.execute(producer1);
service.execute(producer2);
service.execute(producer3);
service.execute(consumer1);
service.execute(consumer2);
service.execute(consumer3);
Thread.sleep(10 * 1000);
producer1.stop();
producer2.stop();
producer3.stop();
Thread.sleep(3000);
service.shutdown();
}
}