- 題目
簡單實現在線購買電影票,請重點考慮多人同時購買一個座位的情況,可以 使用僞代碼
- 分析
通過題意第一步首先需要有電影票池子使用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買票成功!