Commit a3e69687 authored by Tong Li's avatar Tong Li

多线程

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