Java多线程实现消费者/生产者模式

该程序多线程基础知识学习的。

实现了1个生产者,1个消费者。当生产者一旦生产了task时,通知消费者(当没有task时,消费者是wait状态),消费立即获取它。

用到的知识点:

1、多线程

2、多线程wait,nofity(notifyAll)。

3、单类模式


生产者接口:

package com.wateray.comsumer;

public interface IProducer extends Runnable {

}

消费者接口:

package com.wateray.comsumer;

public interface IComsumer extends Runnable {

}

生产的产品类:

package com.wateray.comsumer;

import java.util.ArrayList;
import java.util.List;

public class Productor {
	private List<String> taskList = new ArrayList<String>(1000);
	private static Productor instance = new Productor();

	private Productor() {
	}

	public static Productor getInstance() {
		return instance;
	}

	public void addProduct(String task) {
		taskList.add(task);
	}

	public String getProduct() {
		String task = null;
		if (!taskList.isEmpty()) {
			task = taskList.remove(0);
		}

		return task;
	}

	public boolean isEmpty() {
		return taskList.isEmpty();
	}
}


生产者实现类:

package com.wateray.comsumer;

public class Producer implements IProducer {
	private Productor productor;
	private int count;

	public Producer(Productor productor) {
		this.productor = productor;
	}

	@Override
	public void run() {
		while (true) {
			count++;
			productor.addProduct("task " + count);
			System.out.println("Produce new Task, count::" + count);
			synchronized (productor) {
				try {
					productor.notifyAll();
					productor.wait((long) (Math.random() + 1) * (5000));
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

消费者实现类:
package com.wateray.comsumer;

public class Comsumer implements IComsumer {

	private Productor productor;

	public Comsumer(Productor productor) {
		this.productor = productor;
	}

	@Override
	public void run() {
		String task = null;
		while (true) {

			while (productor.isEmpty()) {
				synchronized (productor) {
					try {
						productor.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}

			task = productor.getProduct();
			if (null != task) {
				System.out.println("[" + task + "] Comsumed");
			}
		}

	}
}

测试运行类:

/**
 * 
 */
package com.wateray.comsumer;

/**
 * @author lwb
 * 
 */
public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("begin main");
		Productor p = Productor.getInstance();

		Thread producerThread = new Thread(new Producer(p));
		Thread comsumerThread = new Thread(new Comsumer(p));
	//	producerThread.setDaemon(true);
		comsumerThread.setDaemon(true);
		producerThread.start();
		comsumerThread.start();

		System.out.println("End main");
	}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值