软件编程
位置:首页>> 软件编程>> java编程>> java多线程模拟抢红包功能

java多线程模拟抢红包功能

作者:淘金者05012  发布时间:2023-07-25 01:09:58 

标签:java,抢红包

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

来源:http://blog.csdn.net/u011411069/article/details/52503835

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com