线程通信-----生产者与消费者案例
发布日期:2021-06-28 13:57:20 浏览次数:9 分类:技术文章

本文共 2267 字,大约阅读时间需要 7 分钟。

import java.util.LinkedList;public class Test {	public static void main(String[] args) {		Baskets baskets = new Baskets();		Producters producters = new Producters(baskets);		Consumers consumers = new Consumers(baskets);		producters.start();//生产者进行生产		consumers.start();//消费者进行消费	}}/** * 消费者线程 * @author Administrator * */class Consumers extends Thread{	private Baskets baskets = null;	public Consumers(Baskets baskets) {		this.baskets = baskets;	}	@Override	public void run() {		baskets.popApple();	}}/** * 生产者线程 * @author Administrator * */class Producters extends Thread{	private Baskets baskets = null;	public Producters(Baskets baskets) {		this.baskets = baskets;	}	@Override	public void run() {		baskets.pushApple();	}}class Baskets{	private LinkedList
basket = new LinkedList<>();//创建一个篮子原来存放Apples /** * 分四次取出苹果 */ public synchronized void popApple() {//需要声明同步方法才能获得该对象的锁 for(int i=0;i<20;i++) { pop(); } } /** * 分四次放苹果 */ public synchronized void pushApple() {//需要声明同步方法才能获得该对象的锁 for(int i=0;i<20;i++) { Apples apples = new Apples(i); push(apples); } } /** * 取出苹果 * @param apples */ public void pop() { if(basket.size() == 0) {//当篮子里面的苹果为0,通知并等待生产者来生产 try { wait();//等待并释放当前该对象锁 } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("取出"+basket.removeFirst().toString()); notify();//通知生产者来生产 } /** * 存放苹果 * @param apples */ public void push(Apples apples) { if(basket.size() == 5) {//当篮子里面的苹果满了通知并等待消费者来消费 try { wait();//等待并释放当前该对象锁 } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } basket.addFirst(apples); System.out.println("存放"+apples.toString()); notify();//通知消费者来消费 } }class Apples{ private int id; public Apples(int id) {//给每个苹果标号 this.id = id ; } public String toString() { return "苹果"+(id+1); }}

【运行结果】

存放苹果1

存放苹果2
存放苹果3
存放苹果4
存放苹果5
取出苹果5
取出苹果4
取出苹果3
取出苹果2
取出苹果1
存放苹果6
存放苹果7
存放苹果8
存放苹果9
存放苹果10
取出苹果10
取出苹果9
取出苹果8
取出苹果7
取出苹果6
存放苹果11
存放苹果12
存放苹果13
存放苹果14
存放苹果15
取出苹果15
取出苹果14
取出苹果13
取出苹果12
取出苹果11
存放苹果16
存放苹果17
存放苹果18
存放苹果19
存放苹果20
取出苹果20
取出苹果19
取出苹果18
取出苹果17
取出苹果16

转载地址:https://blog.csdn.net/wyf2017/article/details/80377411 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:NAT配置
下一篇:线程同步&案例详解

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月17日 09时01分43秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章