首页 > 开发 > Java > 正文

java多线程模拟抢红包功能

2024-07-13 10:14:31
字体:
来源:转载
供稿:网友

今天有朋友问我一道面试题,有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 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表