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买票成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛乌龟一起走

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值