今天有朋友问我一道面试题,有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>>>>>>>>>>>>>>>>>>>>>>>>>>>>name0 end>>>>>>>>>>>>>>>>>>>>>>>>>>>>name4 end>>>>>>>>>>>>>>>>>>>>>>>>>>>>name3 Disconnected from the target VM, address: '127.0.0.1:8869', transport: 'socket' end>>>>>>>>>>>>>>>>>>>>>>>>>>>>name1 end>>>>>>>>>>>>>>>>>>>>>>>>>>>>name2 Process finished with exit code 0
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Android辅助功能AccessibilityService与抢红包辅助,包括了Android辅助功能AccessibilityService与抢红包辅助的使用技巧和注意事项,需要的朋友参考一下 推荐阅读:Android中微信抢红包插件原理解析及开发思路 抢红包的原理都差不多,一般是用Android的辅助功能(AccessibilityService类)先监听通知栏事件或窗口变化事
本文向大家介绍Shell脚本模拟多线程功能分享,包括了Shell脚本模拟多线程功能分享的使用技巧和注意事项,需要的朋友参考一下 说明:{} 这部分语句被放入后台作为一个子进程执行,这部分几乎是同时完成的,当fifo中10个空行读完后 while循环 继续等待 read 中读取fifo数据,当后台的10个子进程后,按次序排队往fifo输入空行,这样fifo中又有了数据,for语句继续执行。
请求header POST /v1/activities/{频道id}/redpack Authorization:Bearer {ACCESS TOKEN} Content-Type:application/json 注: 请将上方的{ACCESS TOKEN}替换为您的ACCESS TOKEN 请将"{频道id}"替换您需要获取的频道id { "type" : "send",
本文向大家介绍java模拟实现微信红包算法,包括了java模拟实现微信红包算法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java实现微信红包算法的具体代码,供大家参考,具体内容如下 实现过程 1.代码如下(示例): 2.代码如下(示例): 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
Android 微信抢红包外挂是一个自动化抢微信红包的源码,很简单的方式实现(找关键字的View然后自动点击)。完全模拟人工操作,抢红包速度取决于手机的性能与网络,不涉及任何第三方软件接口。 当然原理很简单,过程很复杂,因为主要是用到AccessibilityService这个辅助服务,而网上关于这个用法也是很少讲解,都是靠自己一步一步研究出来。这份源码基本可以满足抢红包的功能,但仍需要进行一些逻辑优化。 效果预览:
本文向大家介绍Android辅助功能实现自动抢红包(附源码),包括了Android辅助功能实现自动抢红包(附源码)的使用技巧和注意事项,需要的朋友参考一下 一、描述 最近看到同事有用抢红包的软件,就想看看抢红包的具体实现是如何的,所以了解了一下,有用辅助功能实现的,所以在下面的示例中会展示一个抢红包的小Demo,附带源码抢红包源码。 二、效果图 在桌面收到红包进行抢 在聊天页面收到口令红包 三、A
本文向大家介绍python并发编程多进程 模拟抢票实现过程,包括了python并发编程多进程 模拟抢票实现过程的使用技巧和注意事项,需要的朋友参考一下 抢票是并发执行 多个进程可以访问同一个文件 多个进程共享同一文件,我们可以把文件当数据库,用多个进程模拟多个人执行抢票任务 db.txt 并发运行,效率高,但竞争写同一文件,数据写入错乱,只有一张票,都卖成功给了10个人 总结:程序出现数据写入错
本文向大家介绍Android实现QQ抢红包插件,包括了Android实现QQ抢红包插件的使用技巧和注意事项,需要的朋友参考一下 又想到快要过年了,到时候还不知道群里要发好多红包,所以我将之前在网上宕的一份微信抢红包的代码修改了一下,实现了QQ抢红包!可以支持抢QQ拼手气红包,普通红包,口令红包,现在再也不怕20年单身手速的人跟我抢红包了! 先看测试效果图: 1.抢QQ口令红包