我是靠谱客的博主 可耐花瓣,最近开发中收集的这篇文章主要介绍Java中多线程的使用(二):消费者抢购商品示例消费者抢购商品示例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

消费者抢购商品示例

举一个简单的消费者抢购商店商品(求随机数)的例子作为多线程的入门例子:

先放主函数,商店开门,然后5个消费者抢购商品:

package store;
import store.Customer;
import store.Store;

public class Applicaiton {
	public static Store store = new Store();
	public static void main(String[] args) {
		store.open();
		int i;
		for (i = 1; i <= 5; i++) {
			new Customer(String.valueOf(i)).buyGoods(store);
		}
	}
}

商店类(商店类没啥别的父类要继承直接继承Thread,否则要用接口Runnable),CheckGoodsCountThread负责每秒check一次确定商品是否卖完:

package store;

public class Store {
	public int goodsCount = 100;

	public void open() {
		CheckGoodsCountThread storeOpenThread = new CheckGoodsCountThread();
		storeOpenThread.start();
	}

	//check goods has been sell out
	class CheckGoodsCountThread extends Thread {
		@Override
		public void run() {
			try {
				while (goodsCount > 0) {
					Thread.sleep(1000);//睡一会避免浪费资源
				}
				System.out.println("ok");
			} catch (Exception ex) {
				System.err.println(ex.getMessage());
			} finally {
			}
		}
	}
}

消费者类,CustomerBuyGoodsThread负责抢购商品,注意使用synchronized进行同步,不然结果会很奇怪;注意notifyAll()和wait()方法的使用以及顺序

package store;

public class Customer {
	public String name;
	public int goodsCount;

	public Customer(String name) {
		this.name = name;
	}

	public void buyGoods(Store store) {
		goodsCount = 0;
		CustomerBuyGoodsThread customerThread = new CustomerBuyGoodsThread(store);
		customerThread.start();
	}

	class CustomerBuyGoodsThread extends Thread {
		private Store store;

		CustomerBuyGoodsThread(Store store) {
			this.store = store;
		}

		@Override
		public void run() {
			synchronized (store) {
				try {
					while (store.goodsCount > 0) {
						store.goodsCount--;
						goodsCount++;
						store.notifyAll();//必须先notifyAll,然后wait,否则可能会所有线程都在等待
						store.wait();
					}
					store.notifyAll();//结束线程之前也要notifyAll,通知其它线程资源已经被释放了
				} catch (Exception ex) {
					System.err.println(ex.getMessage());
				} finally {
					System.out.println(name + ": " + String.valueOf(goodsCount));
				}
			}
		}
	}
}

这样我们就可以得到5个随机数啦???(现在刚刚多线程入门,并不知道MQ和线程池的存在)

4: 19
5: 14
1: 18
3: 32
2: 17
ok

 

最后

以上就是可耐花瓣为你收集整理的Java中多线程的使用(二):消费者抢购商品示例消费者抢购商品示例的全部内容,希望文章能够帮你解决Java中多线程的使用(二):消费者抢购商品示例消费者抢购商品示例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部