Java筆試題之多線程

  • 題目

簡單實現在線購買電影票,請重點考慮多人同時購買一個座位的情況,可以 使用僞代碼

  • 分析

通過題意第一步首先需要有電影票池子使用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買票成功!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章