Java implements producer consumer model based on Queue

Producer model for testing:

package domain;

import java.util.Queue;

/**
 * 生产者模型
 * 
 * @author WanAkiko
 * 
 */
public class Productor implements Runnable {

	private Queue<String> queue; // 生产队列
	private Integer maxTask; // 最大产量
	int i = 1; // 生产计数

	public Productor(Queue<String> queue, Integer maxTask) {
		super();
		this.queue = queue;
		this.maxTask = maxTask;
	}

	@Override
	public void run() {
		while (true) {
			synchronized (queue) {
				while (queue.size() >= maxTask) {
					try {
						queue.wait(); // 线程进入阻塞状态
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				try {
					Thread.sleep(1000); // 模拟生产用时
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				String msg = "产品序列-" + (i++);
				queue.add(msg);
				System.out.println("生产者线程:" + msg);
				queue.notify(); // 唤醒阻塞线程
			}
		}
	}

}

Consumer model for testing:

package domain;

import java.util.Queue;

/**
 * 消费者模型
 * 
 * @author WanAkiko
 * 
 */
public class Customer implements Runnable {

	private Queue<String> queue; // 生产队列
	@SuppressWarnings("unused")
	private Integer maxTask; // 最大产量

	public Customer(Queue<String> queue, Integer maxTask) {
		super();
		this.queue = queue;
		this.maxTask = maxTask;
	}

	@Override
	public void run() {
		while (true) {
			synchronized (queue) {
				while (queue.size() == 0) {
					try {
						queue.wait(); // 线程进入阻塞状态
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				try {
					Thread.sleep(1000); // 模拟消费用时
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("消费者线程:" + queue.remove());
				queue.notify(); // 唤醒阻塞线程
			}
		}
	}

}

Model test:

package client;

import java.util.LinkedList;
import java.util.Queue;

import domain.Customer;
import domain.Productor;

public class PC01Test {
	
	public static void main(String[] args) {
		
		Queue<String> queue = new LinkedList<String>();
		int maxTask = 3;
		new Thread(new Productor(queue, maxTask)).start();
		new Thread(new Customer(queue, maxTask)).start();
		
	}

}

Run example:
Insert picture description here

Guess you like

Origin blog.csdn.net/qq_44965393/article/details/112733151