本篇内容为6月3日所学知识,因疏忽未及时上传至博客,见谅。
对于决赛叫号系统的模拟我们可以创建一个房间类 FinalRoom,该类包含两个属性 roomName(决赛室名称)和 teamList(对应决赛室的参赛队伍)。然后通过多线程技术,实现 Runnable 接口的 run() 方法,在方法体中编写处理逻辑。值得注意的是,每次处理时需要对当前 FinalRoom 对象上同步锁,以防止其他线程同时操作造成数据错误。直接遍历该赛事的所有队伍,每个参赛队伍睡眠 0.5 秒,模拟参赛时间即可。
对应部分的代码如下:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FinalRoom implements Runnable{
// 决赛室
private String roomName;
// 决赛室的队伍
private List<Team> teamList;
@Override
public void run() {
// 使用同步锁,防止多个线程同时访问(锁住当前对象)
synchronized(this){
System.out.println("决赛室" + roomName + "开始叫号");
for (Team team : teamList) {
System.out.println("决赛室" + roomName + "叫号:" + team.getTeamNumber());
try{
// 每隔0.5秒叫号一次
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("决赛室" + roomName + "叫号结束");
}
}
}
队伍每个决赛时对应的参赛队伍,我们可以效仿前面参赛队伍容器的思路,使用静态代码块,在类加载时自动执行将对应的队伍分别加到指定的决赛室即可。
对应的代码部分如下:
@Data
public class FinalsCallSystem {
// 决赛室 1
public static List<Team> teamList1 = new ArrayList<>();
// 决赛室 2
public static List<Team> teamList2 = new ArrayList<>();
// 队伍业务逻辑接口
private static TeamService teamService = new TeamServiceImpl();
// 静态代码块(为每个决赛室添加对应的参赛队伍)
static {
// 查询所有的 平面设计 赛事参赛队伍
List<Team> designTeamList = teamService.getByEventCategory("平面设计");
// 查询所有的 网页设计 赛事参赛队伍
List<Team> webTeamList = teamService.getByEventCategory("环境设计");
// 将 平面设计 赛事参赛队伍添加到决赛室 1
teamList1.addAll(designTeamList);
// 将 网页设计 赛事参赛队伍添加到决赛室 2
teamList2.addAll(webTeamList);
}
}