Commit a3e69687 authored by Tong Li's avatar Tong Li

多线程

parent 254b5ff2
...@@ -16,7 +16,7 @@ public class Machine { ...@@ -16,7 +16,7 @@ public class Machine {
private double totalTaskTime=0; private double totalTaskTime=0;
private List<Shift> shifts; private List<Shift> shifts;
private List<MaintenanceWindow> maintenanceWindows; private List<MaintenanceWindow> maintenanceWindows;
private List<TimeSegment> availability; private List<TimeSegment> availability=new CopyOnWriteArrayList();
private String code; private String code;
private List<Holiday> holidays; private List<Holiday> holidays;
...@@ -31,7 +31,7 @@ public class Machine { ...@@ -31,7 +31,7 @@ public class Machine {
public Machine() { public Machine() {
this.shifts = new ArrayList<>(); this.shifts = new ArrayList<>();
this.maintenanceWindows = new ArrayList<>(); this.maintenanceWindows = new ArrayList<>();
this.availability = new ArrayList<>(); this.availability = new CopyOnWriteArrayList<>();
} }
public Machine(int id, String name) { public Machine(int id, String name) {
......
...@@ -4,6 +4,7 @@ import java.time.LocalDateTime; ...@@ -4,6 +4,7 @@ import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.CopyOnWriteArrayList;
public class MachineTimeline { public class MachineTimeline {
private Long machineId; private Long machineId;
...@@ -14,7 +15,7 @@ public class MachineTimeline { ...@@ -14,7 +15,7 @@ public class MachineTimeline {
private int version = 1; private int version = 1;
public MachineTimeline() { public MachineTimeline() {
this.segments = new ArrayList<>(); this.segments = new CopyOnWriteArrayList<>();
} }
// Getters and Setters // Getters and Setters
......
...@@ -15,6 +15,7 @@ import java.time.LocalDateTime; ...@@ -15,6 +15,7 @@ import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.*; import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -697,14 +698,14 @@ public class MachineCalculator { ...@@ -697,14 +698,14 @@ public class MachineCalculator {
if (newSegments == null || newSegments.isEmpty()) { if (newSegments == null || newSegments.isEmpty()) {
return; return;
} }
List<TimeSegment> availabilitySnapshot = new ArrayList<>(machine.getAvailability());
availabilitySnapshot.addAll(newSegments);
List<TimeSegment> mergedSegments = MergeSegments(availabilitySnapshot);
synchronized (machine.getAvailability()) { machine.getAvailability().addAll(newSegments);
List<TimeSegment> mergedSegments = MergeSegments(machine.getAvailability());
// synchronized (machine.getAvailability()) {
// 合并片段(去重+排序), // 合并片段(去重+排序),
machine.setAvailability(mergedSegments); machine.setAvailability(mergedSegments);
} // }
...@@ -735,16 +736,16 @@ public class MachineCalculator { ...@@ -735,16 +736,16 @@ public class MachineCalculator {
*/ */
private TimeSegment GetCurrentOrNextShift(Machine machine, LocalDateTime time, String prevtime, boolean checkprevtime) { private TimeSegment GetCurrentOrNextShift(Machine machine, LocalDateTime time, String prevtime, boolean checkprevtime) {
TimeSegment start = null; TimeSegment start = null;
List<TimeSegment> availabilitySnapshot = new ArrayList<>(machine.getAvailability());
if (!availabilitySnapshot.isEmpty()) if (!machine.getAvailability().isEmpty())
{ {
start = availabilitySnapshot.stream() start = machine.getAvailability().stream()
.filter(slot -> !slot.isUsed() && slot.getType() != SegmentType.MAINTENANCE) .filter(slot -> !slot.isUsed() && slot.getType() != SegmentType.MAINTENANCE)
.filter(slot -> slot.getStart().isAfter(time) || slot.getEnd().isAfter(time)) .filter(slot -> slot.getStart().isAfter(time) || slot.getEnd().isAfter(time))
.findFirst() .findFirst()
.orElse(null); .orElse(null);
}else { }else {
machine.setAvailability(new ArrayList<>()); machine.setAvailability(new CopyOnWriteArrayList<>());
} }
// 查找有效班次 // 查找有效班次
...@@ -753,9 +754,9 @@ public class MachineCalculator { ...@@ -753,9 +754,9 @@ public class MachineCalculator {
// 生成新时间段 // 生成新时间段
List<TimeSegment> timeSegments = machineScheduler.generateTimeSegment(machine, time.plusDays(1),0); List<TimeSegment> timeSegments = machineScheduler.generateTimeSegment(machine, time.plusDays(1),0);
synchronized (machine.getAvailability()) {
machine.getAvailability().addAll(timeSegments); machine.getAvailability().addAll(timeSegments);
}
// 更新设备时间线 // 更新设备时间线
Machine originalMachine = machines.stream() Machine originalMachine = machines.stream()
.filter(t -> t.getId() == machine.getId()) .filter(t -> t.getId() == machine.getId())
...@@ -976,7 +977,7 @@ public class MachineCalculator { ...@@ -976,7 +977,7 @@ public class MachineCalculator {
return times; return times;
} }
private void RemoveMachineAvailable1(Machine machine, ScheduleResultDetail geneDetails,TimeSegment targetSegment) { private void RemoveMachineAvailable(Machine machine, ScheduleResultDetail geneDetails,TimeSegment targetSegment) {
// 关键修复2:加锁(若多线程访问),避免并发修改 // 关键修复2:加锁(若多线程访问),避免并发修改
...@@ -1005,16 +1006,16 @@ public class MachineCalculator { ...@@ -1005,16 +1006,16 @@ public class MachineCalculator {
if(usedSegment!=null) if(usedSegment!=null)
{ {
synchronized (machine.getAvailability()) {
machine.getAvailability().add(usedSegment); machine.getAvailability().add(usedSegment);
machine.getAvailability().sort(Comparator.comparing(TimeSegment::getStart)); machine.getAvailability().sort(Comparator.comparing(TimeSegment::getStart));
}
} }
} }
private void RemoveMachineAvailable(Machine machine, ScheduleResultDetail geneDetails,TimeSegment targetSegment1) { private void RemoveMachineAvailable1(Machine machine, ScheduleResultDetail geneDetails,TimeSegment targetSegment1) {
List<TimeSegment> timeSegments = new ArrayList<>(); List<TimeSegment> timeSegments = new ArrayList<>();
List<TimeSegment> availabilitySnapshot = new ArrayList<>(machine.getAvailability()); List<TimeSegment> availabilitySnapshot = new ArrayList<>(machine.getAvailability());
...@@ -1050,12 +1051,12 @@ public class MachineCalculator { ...@@ -1050,12 +1051,12 @@ public class MachineCalculator {
} }
availabilitySnapshot.sort(Comparator.comparing(TimeSegment::getStart)); availabilitySnapshot.sort(Comparator.comparing(TimeSegment::getStart));
// 关键修复2:加锁(若多线程访问),避免并发修改 // 关键修复2:加锁(若多线程访问),避免并发修改
synchronized (machine.getAvailability()) {
machine.setAvailability(availabilitySnapshot); machine.setAvailability(availabilitySnapshot);
}
} }
public void AddMachineAvailable1(Machine machine, List<ScheduleResultDetail> geneDetails) { public void AddMachineAvailable(Machine machine, List<ScheduleResultDetail> geneDetails) {
if (geneDetails == null || geneDetails.isEmpty()) return; if (geneDetails == null || geneDetails.isEmpty()) return;
List<String> keys= geneDetails.stream(). List<String> keys= geneDetails.stream().
...@@ -1079,7 +1080,7 @@ if(keys1!=null&&keys1.size()>0) { ...@@ -1079,7 +1080,7 @@ if(keys1!=null&&keys1.size()>0) {
} }
public void AddMachineAvailable(Machine machine, List<ScheduleResultDetail> geneDetails) { public void AddMachineAvailable1(Machine machine, List<ScheduleResultDetail> geneDetails) {
if (geneDetails == null || geneDetails.isEmpty()) return; if (geneDetails == null || geneDetails.isEmpty()) return;
List<TimeSegment> availabilitySnapshot = new ArrayList<>(machine.getAvailability()); List<TimeSegment> availabilitySnapshot = new ArrayList<>(machine.getAvailability());
......
...@@ -14,6 +14,7 @@ import java.time.LocalDateTime; ...@@ -14,6 +14,7 @@ import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -50,7 +51,7 @@ public class MachineSchedulerService { ...@@ -50,7 +51,7 @@ public class MachineSchedulerService {
// 创建新时间线(60天范围) // 创建新时间线(60天范围)
MachineTimeline newTimeline = generateTimeline(machine); MachineTimeline newTimeline = generateTimeline(machine);
newTimeline.setSegments(mergeSegments(newTimeline.getSegments())); // newTimeline.setSegments(mergeSegments(newTimeline.getSegments()));
timelineCache.put(machineId, newTimeline); timelineCache.put(machineId, newTimeline);
return newTimeline; return newTimeline;
...@@ -66,7 +67,7 @@ public class MachineSchedulerService { ...@@ -66,7 +67,7 @@ public class MachineSchedulerService {
LocalDate currentDate = currentTime.toLocalDate(); LocalDate currentDate = currentTime.toLocalDate();
LocalDate endDate = currentTime.plusDays(200).toLocalDate(); LocalDate endDate = currentTime.plusDays(200).toLocalDate();
List<TimeSegment> allSegments = new ArrayList<>(); List<TimeSegment> allSegments = new CopyOnWriteArrayList<>();
while (!currentDate.isAfter(endDate)) { while (!currentDate.isAfter(endDate)) {
// 检查是否在假期内 // 检查是否在假期内
...@@ -101,7 +102,7 @@ public class MachineSchedulerService { ...@@ -101,7 +102,7 @@ public class MachineSchedulerService {
} }
if(maintenanceWindow.getStartTime().isBefore(currentTime)&&maintenanceWindow.getEndTime().isAfter(maxEnd)) if(maintenanceWindow.getStartTime().isBefore(currentTime)&&maintenanceWindow.getEndTime().isAfter(maxEnd))
{ {
timeline.setSegments(new ArrayList<>()); timeline.setSegments(new CopyOnWriteArrayList<>());
currentTime=maintenanceWindow.getEndTime(); currentTime=maintenanceWindow.getEndTime();
timeline= generateTimeline(machine); timeline= generateTimeline(machine);
break; break;
...@@ -138,7 +139,7 @@ try { ...@@ -138,7 +139,7 @@ try {
timeline.setValidFrom(currentTime); timeline.setValidFrom(currentTime);
timeline.setValidTo(currentTime.plusDays(days)); timeline.setValidTo(currentTime.plusDays(days));
timeline.setLastUpdated(LocalDateTime.now()); timeline.setLastUpdated(LocalDateTime.now());
timeline.setSegments(new ArrayList<>()); timeline.setSegments(new CopyOnWriteArrayList<>());
} else { } else {
if(currentTime==null) if(currentTime==null)
{ {
...@@ -163,7 +164,7 @@ try { ...@@ -163,7 +164,7 @@ try {
LocalDate currentDate = currentTime.toLocalDate(); LocalDate currentDate = currentTime.toLocalDate();
LocalDate endDate = currentTime.plusDays(days).toLocalDate(); LocalDate endDate = currentTime.plusDays(days).toLocalDate();
List<TimeSegment> segments = new ArrayList<>(); List<TimeSegment> segments = new CopyOnWriteArrayList<>();
while (!currentDate.isAfter(endDate)) { while (!currentDate.isAfter(endDate)) {
// 检查是否在假期内 // 检查是否在假期内
...@@ -260,7 +261,7 @@ try { ...@@ -260,7 +261,7 @@ try {
} }
private List<TimeSegment> calculateDaySegments(Machine machine, LocalDate date, boolean isHoliday) { private List<TimeSegment> calculateDaySegments(Machine machine, LocalDate date, boolean isHoliday) {
List<TimeSegment> segments = new ArrayList<>(); List<TimeSegment> segments = new CopyOnWriteArrayList<>();
if (isHoliday) { if (isHoliday) {
// 假期:只处理特定日期的班次 // 假期:只处理特定日期的班次
...@@ -399,7 +400,7 @@ if(shifts==null||shifts.size()==0) { ...@@ -399,7 +400,7 @@ if(shifts==null||shifts.size()==0) {
} }
} }
List<TimeSegment> result = new ArrayList<>(merged); List<TimeSegment> result = new CopyOnWriteArrayList<>(merged);
result.addAll(maintenanceSegments); result.addAll(maintenanceSegments);
// 按开始时间排序 // 按开始时间排序
...@@ -433,7 +434,7 @@ if(shifts==null||shifts.size()==0) { ...@@ -433,7 +434,7 @@ if(shifts==null||shifts.size()==0) {
} }
} }
List<MaintenanceWindow> result = new ArrayList<>(merged); List<MaintenanceWindow> result = new CopyOnWriteArrayList<>(merged);
// 按开始时间排序 // 按开始时间排序
result.sort(Comparator.comparing(MaintenanceWindow::getStartTime)); result.sort(Comparator.comparing(MaintenanceWindow::getStartTime));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment