实例225 模拟淘宝购物买卖双方交易问题
实例225 模拟淘宝购物买卖双方交易问题
import java.util.Random; public class OnlineStore { public static void main(String[] args){ Alipay alipay = new Alipay(2); //创建2个支付宝 //创建实例并启动线程 new Seller("卖家-衣拉客",alipay,5).start(); new Seller("卖家-衣院", alipay, 7).start(); new Buyer("买家-小A",alipay,101).start(); new Buyer("买家-小B",alipay,102).start(); } } class Alipay{ // 支付宝 用于网上买卖交易 private final String[] goods; //标识卖家商品,数组的长度是多少则表示商品的数量是多少 private int n; //标识存入支付宝交易数量 private int m; //标识支出支付宝交易数量 private int count; public Alipay(int count){ // 构造方法进行初始化 this.goods = new String[count]; //创建字符串数组 this.m = 0; this.n = 0; this.count = 0; } public synchronized void storage(String alipay){ // 往支付宝里存款 System.out.println("淘宝用户ID=" + Thread.currentThread().getName() + "\t支付宝存入" + alipay); try{ while(count >= goods.length){ wait(); // 线程等待 } goods[n] = alipay; // 放置支付宝账号于数组 n = (n + 1) % goods.length; count++; notifyAll(); }catch(Exception e){ // 捕获异常 System.out.println("支付宝存入功能出现错误:" + e.getMessage()); } } public synchronized String outlay(){ // 往支付宝里支出 String alipay = null; try{ while(count <= 0){ wait(); // 线程等待 } alipay = goods[m]; m = (m + 1) % goods.length; //支出支付宝交易数量 count--; // 数组个数减一 }catch(Exception e){ } System.out.println("淘宝用户ID=" + Thread.currentThread().getName() + "\t支付宝支出" + alipay); return alipay; } } class Buyer extends Thread{ // 买家线程类 private final Random random; private final Alipay alipay; private static int id = 0; //// 交易的流水号 public Buyer(String name, Alipay alipay,long seed){ // 构造方法进行初始化 super(name); this.alipay = alipay; this.random = new Random(seed); } public void run(){ try{ while(true){ Thread.sleep(random.nextInt(1000)); //随机休眠 String flowerID = "交易流水账号" + nextId(); alipay.storage(flowerID); //存入支付宝中 } }catch(Exception e){ //捕获异常 } } private static synchronized int nextId(){ return id++; } } class Seller extends Thread{ // 卖家线程类 private final Random random; private final Alipay alipay; //卖家支付宝? public Seller(String name, Alipay alipay, long seed){ super(name); this.alipay = alipay; this.random = new Random(seed); // 创建随机对象 } public void run() { // 实现Thread类的方法,启动线程 try { while (true) { String alipay = this.alipay.outlay(); Thread.sleep(random.nextInt(1000)); } } catch (Exception e) { // 捕获异常 System.out.println("买家支付预付款出错:" + e.getMessage()); } } }
输出:
淘宝用户ID=卖家-衣拉客 支付宝支出交易流水账号8 淘宝用户ID=卖家-衣院 支付宝支出交易流水账号9 淘宝用户ID=买家-小B 支付宝存入交易流水账号11 淘宝用户ID=卖家-衣拉客 支付宝支出交易流水账号11 淘宝用户ID=卖家-衣院 支付宝支出交易流水账号10 淘宝用户ID=买家-小B 支付宝存入交易流水账号12 淘宝用户ID=卖家-衣院 支付宝支出交易流水账号12 淘宝用户ID=买家-小B 支付宝存入交易流水账号13 淘宝用户ID=卖家-衣院 支付宝支出交易流水账号13 淘宝用户ID=买家-小A 支付宝存入交易流水账号14 淘宝用户ID=卖家-衣拉客 支付宝支出交易流水账号14 淘宝用户ID=买家-小A 支付宝存入交易流水账号15 淘宝用户ID=买家-小B 支付宝存入交易流水账号16 淘宝用户ID=卖家-衣拉客 支付宝支出交易流水账号15 淘宝用户ID=卖家-衣院 支付宝支出交易流水账号16 淘宝用户ID=买家-小A 支付宝存入交易流水账号17 淘宝用户ID=卖家-衣院 支付宝支出交易流水账号17 淘宝用户ID=买家-小B 支付宝存入交易流水账号18 淘宝用户ID=卖家-衣拉客 支付宝支出交易流水账号18 淘宝用户ID=买家-小A 支付宝存入交易流水账号19 淘宝用户ID=买家-小A 支付宝存入交易流水账号20 淘宝用户ID=卖家-衣拉客 支付宝支出交易流水账号19 淘宝用户ID=卖家-衣院 支付宝支出交易流水账号20 淘宝用户ID=买家-小A 支付宝存入交易流水账号21 淘宝用户ID=买家-小A 支付宝存入交易流水账号22 淘宝用户ID=买家-小B 支付宝存入交易流水账号23 淘宝用户ID=买家-小A 支付宝存入交易流水账号24 淘宝用户ID=卖家-衣拉客 支付宝支出交易流水账号21 淘宝用户ID=卖家-衣院 支付宝支出交易流水账号22