package com.xjh.demo; import java.util.LinkedList; import java.util.Queue; public class ThreadTest { static final long waitTime = 3000; public static void main(String[] args) { Queue<Integer> queue = new LinkedList<>(); int maxSize = 3; Producer producer = new Producer(queue, maxSize, "producer1"); Consumer consumer1 = new Consumer(queue, "consumer1"); Consumer consumer2 = new Consumer(queue, "consumer2"); Consumer consumer3 = new Consumer(queue, "consumer3"); producer.start(); consumer1.start(); consumer2.start(); consumer3.start(); } static class Producer extends Thread { Queue<Integer> queue; int maxSize; Producer(Queue<Integer> queue, int maxSize, String name) { this.maxSize = maxSize; this.queue = queue; this.setName(name); } @Override public void run() { while (true) { synchronized (queue) { try { Thread.sleep(waitTime); } catch (Exception e) { } System.out.println(this.getName() + "获得对象锁!"); while (queue.size() == maxSize) { System.out.println("队列已满,生产者暂停生产"); try { queue.wait(); } catch (Exception e) { } } int num = (int) Math.random()*1000; queue.offer(num); System.out.println(this.getName() + "生产一个元素:" + num); queue.notifyAll(); } } } } static class Consumer extends Thread { Queue<Integer> queue; Consumer(Queue<Integer> queue, String name) { this.queue = queue; this.setName(name); } @Override public void run() { while (true) { synchronized (queue) { try { Thread.sleep(waitTime); } catch (Exception e) { } System.out.println(this.getName() + "获得对象锁!"); while (queue.isEmpty()) { System.out.println("队列已空," + this.getName() + "等待生产"); try { queue.wait(); } catch (Exception e) { } } int num = queue.poll(); System.out.println(this.getName() + "获得数据:" + num); queue.notifyAll(); System.out.println(this.getName() + "退出一次消费过程!"); } } } } }
生产--消费者模式 多线程实例
最新推荐文章于 2022-10-22 20:23:32 发布