Java_多线程_模拟电影院售票

这篇博客详细介绍了如何使用Java的多线程技术来模拟电影院的售票过程,通过实例代码展示了线程创建的第二种方法,深入理解Java并发编程的应用。
package cn.thread3;

import java.util.ArrayList;
import java.util.List;

/**
 * 模拟场景:
 * 电影院上映了哪吒,上海堡垒2部电影
 * 三对情侣cl xy xq同时买票
 * cl xy两对同时购买哪吒5,6两个座位
 * xq购买上海堡垒5,6两个位置
 * @author Chill Lyn
 *
 */
public class CinemaTickets {
	public static void main(String[] args) {
//		初始化各场电影的座位列表
		List<Integer> nezhaSeats = new ArrayList<Integer>();
		List<Integer> baoleiSeats = new ArrayList<Integer>();
//		私人影院,8个座位
		for (int i = 1; i <= 8; i++) {
			nezhaSeats.add(i);
			baoleiSeats.add(i);
		}
//		电影
		Movie nezha = new Movie("哪吒", nezhaSeats);
		Movie baolei = new Movie("上海堡垒", baoleiSeats);
//		观众想挑选座位列表
		List<Integer> clSeats = new ArrayList<Integer>();
		List<Integer> xySeats = new ArrayList<Integer>();
		List<Integer> xqSeats = new ArrayList<Integer>();
//		三对情侣吧?
		for (int i = 5; i <= 6; i++) {
			clSeats.add(i);
			xySeats.add(i);
			xqSeats.add(i);
		}
//		观众
		Customer cl = new Customer(nezha, clSeats);
		Customer xy = new Customer(nezha, xySeats);
		Customer xq = new Customer(baolei, xqSeats);
//		三对情侣同时买票了
		new Thread(cl, "cl").start();
		new Thread(xy, "xy").start();
		new Thread(xq, "xq").start();

	}
}

class Movie {
	// 电影名
	String name;
	// 该场座位
	List<Integer> seatAvailable = new ArrayList<Integer>();

	public Movie(String name, List<Integer> seatAvailable) {
		super();
		this.name = name;
		this.seatAvailable = seatAvailable;
	}
}

class Customer implements Runnable {
	// 想看的电影
	Movie movie;
	// 欲购买座位
	List<Integer> seatWanted = new ArrayList<Integer>();

	public Customer(Movie movie, List<Integer> seatWanted) {
		super();
		this.movie = movie;
		this.seatWanted = seatWanted;
	}

	@Override
	public void run() {
		if (!movie.seatAvailable.containsAll(seatWanted)) {
			System.out.println("抱歉" + Thread.currentThread().getName() + ",电影" + movie.name + ",您挑选的座位:"
					+ seatWanted.toString() + ",您挑选的座位已被其他影迷选中。");
			return;
		}
		synchronized (movie.seatAvailable) {
			if (!movie.seatAvailable.containsAll(seatWanted)) {
				System.out.println("抱歉" + Thread.currentThread().getName() + ",电影" + movie.name + ",您挑选的座位:"
						+ seatWanted.toString() + ",您挑选的座位已被其他影迷选中。");
				return;
			}
			System.out.println(
					"亲爱的" + Thread.currentThread().getName() + movie.name + "可选座位:" + movie.seatAvailable.toString());
			System.out
					.println("亲爱的" + Thread.currentThread().getName() + ",您挑选的座位:" + seatWanted.toString() + ",选座成功!");
			movie.seatAvailable.removeAll(seatWanted);
		}
	}
}

结果参考
在这里插入图片描述
线程创建方式2

package cn.thread3;

import java.util.ArrayList;
import java.util.List;

/**
 * 模拟场景:
 * 电影院上映了哪吒,上海堡垒2部电影
 * 三对情侣cl xy xq同时买票
 * cl xy两对同时购买哪吒5,6两个座位
 * xq购买上海堡垒5,6两个位置
 * @author Chill Lyn
 *
 */
public class CinemaTickets2 {
	public static void main(String[] args) {
//		初始化各场电影的座位列表
		List<Integer> nezhaSeats = new ArrayList<Integer>();
		List<Integer> baoleiSeats = new ArrayList<Integer>();
//		私人影院,8个座位
		for (int i = 1; i <= 8; i++) {
			nezhaSeats.add(i);
			baoleiSeats.add(i);
		}
//		电影
		Movie2 nezha = new Movie2("哪吒", nezhaSeats);
		Movie2 baolei = new Movie2("上海堡垒", baoleiSeats);
//		观众想挑选座位列表
		List<Integer> clSeats = new ArrayList<Integer>();
		List<Integer> xySeats = new ArrayList<Integer>();
		List<Integer> xqSeats = new ArrayList<Integer>();
//		三对情侣吧?
		for (int i = 5; i <= 6; i++) {
			clSeats.add(i);
			xySeats.add(i);
			xqSeats.add(i);
		}
//		观众	
//		三对情侣同时买票了
		new Customer2(nezha, "cl", clSeats).start();
		new Customer2(nezha, "xy", xySeats).start();
		new Customer2(baolei, "xq", xqSeats).start();
	}
}

//单资源movie实现runnable接口仅为了不使用同步块,使用方法同步,多线程操作还依靠customer继承Thread类实现
class Movie2 implements Runnable {
	// 电影名
	String name;
	// 该场座位
	List<Integer> seatAvailable = new ArrayList<Integer>();

	public Movie2(String name, List<Integer> seatAvailable) {
		super();
		this.name = name;
		this.seatAvailable = seatAvailable;
	}

	@Override
	public synchronized void run() {
		Customer2 c = (Customer2) Thread.currentThread();
		if (!seatAvailable.containsAll(c.seatWanted)) {
			System.out.println(
					"抱歉" + c.getName() + ",电影" + name + ",您挑选的座位:" + c.seatWanted.toString() + ",您挑选的座位已被其他影迷选中。");
			return;
		}
		System.out.println("亲爱的" + c.getName() + name + "可选座位:" + seatAvailable.toString());
		System.out.println("亲爱的" + c.getName() + ",您挑选的座位:" + c.seatWanted.toString() + ",选座成功!");
		seatAvailable.removeAll(c.seatWanted);
	}
}

class Customer2 extends Thread {
	// 用户名
	String name;
	// 欲购买座位
	List<Integer> seatWanted = new ArrayList<Integer>();

	public Customer2(Runnable movie, String name, List<Integer> seatWanted) {
		super(movie, name);
		this.name = name;
		this.seatWanted = seatWanted;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值