- 题目
简单实现在线购买电影票,请重点考虑多人同时购买一个座位的情况,可以 使用伪代码
- 分析
通过题意第一步首先需要有电影票池子使用List 存放。然后启动多个线程去消费list 中票。
这个题有两个注意点第一是启动线程的时候保证同时启动。咋们可以使用countDownLatch 实现
第二个就是消费list 保证不能重复购票。使用CopyOnWriteList 或者Collections.synchronizedList(new ArrayList<>()) 实现购票不重复。
- 代码实现
package com.dairuijie.demo.study;
import java.util.concurrent.CountDownLatch;
public class MyThead extends Thread{
private Integer num;
private CountDownLatch countDownLatch;
@Override
public void run() {
// TODO Auto-generated method stub
try {
countDownLatch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
boolean removeFlag = BuyMovieTicket.list.remove(num);
if(removeFlag) {
System.err.println(Thread.currentThread().getName() + "抢到号码为:" + num);
System.err.println(Thread.currentThread().getName()+"买票成功!");
}else {
System.err.println(Thread.currentThread().getName()+"买票失敗!");
}
super.run();
}
public MyThead(Integer num,CountDownLatch countDownLatch) throws InterruptedException {
System.out.println(Thread.currentThread().getName() + "准备抢票的号码:" + num);
this.num = num;
this.countDownLatch = countDownLatch;
}
}
package com.dairuijie.demo.study;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
/**
*
* @模块名:Day01
* @包名:com.dairuijie.demo.study
* @描述:BuyMovieTicket.java
* @版本:1.0
* @创建人:drj
* @创建时间:2020年3月28日下午9:46:06
*/
public class BuyMovieTicket {
public static List<Integer> list = Collections.synchronizedList(new ArrayList<>());//保證安全
public static void main(String[] args) throws InterruptedException {
for(int i=0; i< 5; i++) {
list.add(i);
}
CountDownLatch countDownLatch = new CountDownLatch(15);
Random r = new Random();
for(int i=0; i< 15; i++) {
new MyThead(r.nextInt(5),countDownLatch).start();
countDownLatch.countDown();
}
System.err.println(list);
}
}
- 运行效果
main准备抢票的号码:3
main准备抢票的号码:0
main准备抢票的号码:1
main准备抢票的号码:0
main准备抢票的号码:0
main准备抢票的号码:2
main准备抢票的号码:0
main准备抢票的号码:0
main准备抢票的号码:4
main准备抢票的号码:1
main准备抢票的号码:2
main准备抢票的号码:0
main准备抢票的号码:1
main准备抢票的号码:2
main准备抢票的号码:2
[0, 1, 2, 3, 4]
Thread-8抢到号码为:4
Thread-4买票失敗!
Thread-7买票失敗!
Thread-6抢到号码为:0
Thread-6买票成功!
Thread-5买票失敗!
Thread-1买票失敗!
Thread-12买票失敗!
Thread-0抢到号码为:3
Thread-0买票成功!
Thread-13买票失敗!
Thread-8买票成功!
Thread-3买票失敗!
Thread-2买票失敗!
Thread-11买票失敗!
Thread-10买票失敗!
Thread-9抢到号码为:1
Thread-9买票成功!
Thread-14抢到号码为:2
Thread-14买票成功!