- トピック
オンライン映画チケット購入の簡単な実装、複数の人が同時に座席を購入する状況に焦点を当ててください、あなたは擬似コードを使用することができます
- 分析
質問に合格するための最初のステップは、リストに保存するための映画チケットプールを用意することです。次に、複数のスレッドを開始して、リスト内のチケットを消費します。
この質問には2つの注意点があります。1つは、スレッドが同時に開始されるようにすることです。countDownLatchを使用して、
2つ目は、リストを使用してチケットを繰り返し購入できないようにすることです。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);
}
}
- 実行結果
グラブチケットに準備主番号:3
主番号グラブチケットの準備:0
メイン数グラブチケットの準備:1つの
メイン数グラブチケットの準備:0
メイン数グラブチケットの準備:0
メイン数グラブチケットの準備:2
主準備
チケットを取得する番号:0
メインチケットを取得する番号:0メインチケットを取得する番号:4
メインチケットを取得する番号:1メインチケットを取得する
番号:2
メインチケットを取得する番号:0
メイン番号:1
チケットを取得するメイン番号:
チケットを取得するための2つのメイン番号:2
[0、1、2、3、4]
スレッド-8の取得番号:4
スレッド-4は
チケットの購入に失敗しました!
スレッド-7チケットの購入に失敗しました!スレッド-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はチケットを正常に購入しました!