多线程模拟抢红包
来源:互联网 发布:网络白金作家排行榜 编辑:程序博客网 时间:2024/05/17 07:26
今天有朋友问我一道面试题,有5个人抢5个红包,可重复抢,用多线程程序实现,实现方式有多种,分享一下我的思路:应用了阻塞队列的特性
/** * Created by zhanglinqiang on 2016/6/23. */public class MyTest { public static void main(String[] args) throws InterruptedException { LinkedBlockingQueue<LuckyMoney> luckyMoneys = new LinkedBlockingQueue<>(); List<FutureTask> futureTasks = new ArrayList<>(); //准备抢红包 for (int i = 0; i < 5; i++) { FutureTask<Object> futureTask = new FutureTask<>(new CatchLuckMoney(luckyMoneys, "name" + i), null); new Thread(futureTask,"name"+i).start(); futureTasks.add(futureTask); } Thread.sleep(5);//确保抢红包线程准备就绪 Random random = new Random(100); //发5个红包 for (int i = 0; i < 5; i++) { luckyMoneys.put(new LuckyMoney("红包"+i, random.nextInt(100)+1)); } //等到红包抢完 while (!luckyMoneys.isEmpty()){ Thread.sleep(1); } //终止抢红包线程 for (FutureTask futureTask : futureTasks) { futureTask.cancel(true); } }}class CatchLuckMoney implements Runnable { public CatchLuckMoney(LinkedBlockingQueue<LuckyMoney> luckyMoneys, String name) { this.luckyMoneys = luckyMoneys; this.name = name; } private LinkedBlockingQueue<LuckyMoney> luckyMoneys; private String name; @Override public void run() { while (!Thread.currentThread().isInterrupted()) { LuckyMoney redPackage = null; try { redPackage = luckyMoneys.take(); } catch (InterruptedException e) {// e.printStackTrace(); break; } System.out.println(name + "抢到了-->" + redPackage); luckyMoneys.remove(redPackage); } System.out.println("end>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+Thread.currentThread().getName()); }}class LuckyMoney { public LuckyMoney(String name, Integer money) { this.name = name; this.money = money; } private String name; private Integer money; @Override public String toString() { return "LuckyMoney{" + "name='" + name + '\'' + ", money=" + money + '}'; }}
运行效果:
Connected to the target VM, address: '127.0.0.1:8869', transport: 'socket'name3抢到了-->LuckyMoney{name='红包0', money=16}name4抢到了-->LuckyMoney{name='红包3', money=89}name0抢到了-->LuckyMoney{name='红包2', money=75}name1抢到了-->LuckyMoney{name='红包1', money=51}name3抢到了-->LuckyMoney{name='红包4', money=92}end>>>>>>>>>>>>>>>>>>>>>>>>>>>>name0end>>>>>>>>>>>>>>>>>>>>>>>>>>>>name4end>>>>>>>>>>>>>>>>>>>>>>>>>>>>name3Disconnected from the target VM, address: '127.0.0.1:8869', transport: 'socket'end>>>>>>>>>>>>>>>>>>>>>>>>>>>>name1end>>>>>>>>>>>>>>>>>>>>>>>>>>>>name2Process finished with exit code 0
1 0
- 多线程模拟抢红包
- c语言多线程-模拟微信抢红包
- Java模拟抢红包应用
- java 简单模拟抢红包
- java多线程实现抢红包
- JAVA实现 简单抢红包算法,模拟真实抢红包。
- java 简单模拟抢红包2
- 模拟微信红包
- C4top-抢红包 (模拟-结构体排序)
- 我用java写的抢红包用的红包类,支持多线程
- 模拟微信群聊抢红包小程序
- php模拟微信红包
- 模拟微信红包算法
- 模拟微信分配红包
- 抢红包
- 抢红包
- 抢红包
- 抢红包
- 深入理解java嵌套类和内部类
- XML-03总结---SAX方式解析XML------------------01
- DrawerLayout的使用
- 扩大R控制台的显示行数及DBSCAN包
- 动态规划几个典型题总结
- 多线程模拟抢红包
- JavaScript数据类型——数据类型的一些特点
- JavaScript中call,apply,bind方法的总结
- 51Nod 1056 - N的阶乘的长度(数论)
- 【IIS】XP系统的IIS发布
- C#委托的介绍(delegate、Action、Func、predicate)
- db2客户端因端口问题连接不上db2数据库解决办法
- java中一个服务端对客户端的带界面的聊天室
- 深度学习及机器学习整理--多谢各个网络大神