public class ConsumerProducerTest { public static void main(String[] args) throws InterruptedException { BlockingQueue<PCData> queue = new LinkedBlockingDeque<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(); System.out.println("程序运行结束"); } } /* * 实体类 * */ final class PCData { private final int intData; public PCData(int d) { intData = d; } public PCData(String d) { intData = Integer.valueOf(d); } public int getData() { return intData; } public String toString() { return "data:" + intData; } } /* * 消费者 * */ class Consumer implements Runnable { private BlockingQueue<PCData> queue; private static final int SLEEPTIME = 1000; public Consumer(BlockingQueue<PCData> queue) { this.queue = queue; } public void run() { System.out.println("start Consumer id = " + Thread.currentThread().getId()); Random r = 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(r.nextInt(SLEEPTIME)); } } } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); } } } class Producer implements Runnable { public volatile boolean isRunning = true; private BlockingQueue<PCData> queue; private static AtomicInteger count = new AtomicInteger(); private static final int SLEEPTIME = 1000; public Producer(BlockingQueue<PCData> queue) { this.queue = queue; } public void run() { PCData data = null; Random r = new Random(); System.out.println("start producer id = " + Thread.currentThread().getId()); try { while (isRunning) { Thread.sleep(r.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("faile to put data :" + data); } } } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); } } public void stop() { isRunning = false; } }
模拟生产者消费者
最新推荐文章于 2021-05-12 10:32:15 发布