forked from HillmerCh/CompletableFuture-Examples
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDeveloperService.java
More file actions
104 lines (88 loc) · 3.4 KB
/
DeveloperService.java
File metadata and controls
104 lines (88 loc) · 3.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package co.hillmerch.developers;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.ForkJoinPool;
import java.util.stream.Collectors;
public class DeveloperService {
public List<Developer> generateDeveloperCurrentStatus() {
List<Developer> developerList = this.findDevelopers();
for ( Developer developer : developerList ) {
developer = this.loadNumberOfTasks( developer );
}
return developerList;
}
public List<Developer> generateDeveloperCurrentStatusAsync() {
List<Developer> developerList = this.findDevelopers();
List<CompletableFuture<Developer>> cfList = new ArrayList<>();
for ( Developer developer : developerList ) {
CompletableFuture cf = CompletableFuture.supplyAsync( () -> this.loadNumberOfTasks( developer ) );
cfList.add( cf );
}
CompletableFuture.allOf( cfList.toArray( new CompletableFuture[0] ) ).join();
developerList = cfList.stream()
.filter( CompletableFuture::isDone )
.map( CompletableFuture::join )
.collect( Collectors.toList() );
return developerList;
}
private List<Developer> findDevelopers() {
// Este método simula la consulta de los desarrolladores generalmente sobre una base de datos
return List
.of(
Developer.of( 1L, "Developer 1" ),
Developer.of( 2L, "Developer 2" ),
Developer.of( 3L, "Developer 3" ),
Developer.of( 4L, "Developer 4" ),
Developer.of( 5L, "Developer 5" ),
Developer.of( 6L, "Developer 6" ),
Developer.of( 7L, "Developer 7" ),
Developer.of( 8L, "Developer 8" ),
Developer.of( 9L, "Developer 9" ),
Developer.of( 10L, "Developer 10" )
);
}
private Developer loadNumberOfTasks(Developer developer) {
// Este método simula la consulta del número de tareas asignadas a un desarrollador
// Se genera un valor aleatorio para simular el número de tareas pendientes, en progreso y finalizadas
// por cada desarrollador
Random random = new Random();
developer.setTaskToDo( random.ints( 0, 20 ).findAny().getAsInt() );
developer.setTaskDone( random.ints( 0, 20 ).findAny().getAsInt() );
developer.setTaskInProgress( random.ints( 0, 20 ).findAny().getAsInt() );
this.sleep( 2_000 );//Una pausa de 1 segundo para simular el tiempo que demora la carga de las tareas
return developer;
}
private void sleep(long time) {
try {
Thread.sleep( time );
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
private void printPoolInfo(){
System.out.println( "Pool size: " + ForkJoinPool.commonPool().getPoolSize()
+ ". Thread: " + Thread.currentThread().getName());
}
public List<Developer> generateDeveloperCurrentStatusAsyncWithExecutor(Executor executor) {
List<Developer> developerList = this.findDevelopers();
List<CompletableFuture<Developer>> cfList = new ArrayList<>();
printPoolInfo();
for ( Developer developer : developerList ) {
CompletableFuture cf = CompletableFuture.supplyAsync( () -> this.loadNumberOfTasks( developer ), executor)
.thenRun( () -> printPoolInfo());
cfList.add( cf );
}
printPoolInfo();
CompletableFuture.allOf( cfList.toArray( new CompletableFuture[0] ) ).join();
developerList = cfList.stream()
.filter( CompletableFuture::isDone )
.map( CompletableFuture::join )
.collect( Collectors.toList() );
printPoolInfo();
return developerList;
}
}