概述
消费者抢购商品示例
举一个简单的消费者抢购商店商品(求随机数)的例子作为多线程的入门例子:
先放主函数,商店开门,然后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中多线程的使用(二):消费者抢购商品示例消费者抢购商品示例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复