多线程模拟抢红包

来源:互联网 发布:网络白金作家排行榜 编辑:程序博客网 时间: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
原创粉丝点击