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;
}
}
这篇博客详细介绍了如何使用Java的多线程技术来模拟电影院的售票过程,通过实例代码展示了线程创建的第二种方法,深入理解Java并发编程的应用。
698

被折叠的 条评论
为什么被折叠?



