Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
H
HYH.APSJ
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
佟礼
HYH.APSJ
Commits
a3e69687
Commit
a3e69687
authored
Jan 14, 2026
by
Tong Li
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
多线程
parent
254b5ff2
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
33 additions
and
30 deletions
+33
-30
Machine.java
src/main/java/com/aps/entity/basic/Machine.java
+2
-2
MachineTimeline.java
src/main/java/com/aps/entity/basic/MachineTimeline.java
+2
-1
MachineCalculator.java
...ain/java/com/aps/service/Algorithm/MachineCalculator.java
+20
-19
MachineSchedulerService.java
...in/java/com/aps/service/plan/MachineSchedulerService.java
+9
-8
No files found.
src/main/java/com/aps/entity/basic/Machine.java
View file @
a3e69687
...
...
@@ -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
CopyOnWrite
ArrayList
<>();
}
public
Machine
(
int
id
,
String
name
)
{
...
...
src/main/java/com/aps/entity/basic/MachineTimeline.java
View file @
a3e69687
...
...
@@ -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
CopyOnWrite
ArrayList
<>();
}
// Getters and Setters
...
...
src/main/java/com/aps/service/Algorithm/MachineCalculator.java
View file @
a3e69687
...
...
@@ -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
CopyOnWrite
ArrayList
<>());
}
// 查找有效班次
...
...
@@ -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
RemoveMachineAvailable
1
(
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
RemoveMachineAvailable
1
(
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
AddMachineAvailable
1
(
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
AddMachineAvailable
1
(
Machine
machine
,
List
<
ScheduleResultDetail
>
geneDetails
)
{
if
(
geneDetails
==
null
||
geneDetails
.
isEmpty
())
return
;
List
<
TimeSegment
>
availabilitySnapshot
=
new
ArrayList
<>(
machine
.
getAvailability
());
...
...
src/main/java/com/aps/service/plan/MachineSchedulerService.java
View file @
a3e69687
...
...
@@ -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
CopyOnWrite
ArrayList
<>();
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
CopyOnWrite
ArrayList
<>());
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
CopyOnWrite
ArrayList
<>());
}
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
CopyOnWrite
ArrayList
<>();
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
CopyOnWrite
ArrayList
<>();
if
(
isHoliday
)
{
// 假期:只处理特定日期的班次
...
...
@@ -399,7 +400,7 @@ if(shifts==null||shifts.size()==0) {
}
}
List
<
TimeSegment
>
result
=
new
ArrayList
<>(
merged
);
List
<
TimeSegment
>
result
=
new
CopyOnWrite
ArrayList
<>(
merged
);
result
.
addAll
(
maintenanceSegments
);
// 按开始时间排序
...
...
@@ -433,7 +434,7 @@ if(shifts==null||shifts.size()==0) {
}
}
List
<
MaintenanceWindow
>
result
=
new
ArrayList
<>(
merged
);
List
<
MaintenanceWindow
>
result
=
new
CopyOnWrite
ArrayList
<>(
merged
);
// 按开始时间排序
result
.
sort
(
Comparator
.
comparing
(
MaintenanceWindow:
:
getStartTime
));
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment