生产者消费者模型

来源:互联网 发布:stussy淘宝 编辑:程序博客网 时间:2024/06/15 01:19

生产者消费者的核心是不共享内存缓冲区,这里用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();
    }
}

0 0
原创粉丝点击