Skip to content

Commit f3c2be2

Browse files
authored
Add GangScheduling algorithm (#5819)
1 parent 1d19449 commit f3c2be2

File tree

3 files changed

+115
-0
lines changed

3 files changed

+115
-0
lines changed

DIRECTORY.md

+2
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,7 @@
533533
* [EDFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/EDFScheduling.java)
534534
* [FairShareScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/FairShareScheduling.java)
535535
* [FCFSScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/FCFSScheduling.java)
536+
* [GangScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/GangScheduling.java)
536537
* [HighestResponseRatioNextScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/HighestResponseRatioNextScheduling.java)
537538
* [JobSchedulingWithDeadline](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/JobSchedulingWithDeadline.java)
538539
* [LotteryScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/LotteryScheduling.java)
@@ -1134,6 +1135,7 @@
11341135
* [EDFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/EDFSchedulingTest.java)
11351136
* [FairShareSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/FairShareSchedulingTest.java)
11361137
* [FCFSSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/FCFSSchedulingTest.java)
1138+
* [GangSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/GangSchedulingTest.java)
11371139
* [HighestResponseRatioNextSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/HighestResponseRatioNextSchedulingTest.java)
11381140
* [JobSchedulingWithDeadlineTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/JobSchedulingWithDeadlineTest.java)
11391141
* [LotterySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/LotterySchedulingTest.java)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.thealgorithms.scheduling;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
/**
9+
* GangScheduling groups related tasks (gangs) to run simultaneously on multiple processors.
10+
* All tasks in a gang are executed together or not at all.
11+
*
12+
* Use Case: Parallel computing environments where multiple threads of a program
13+
* need to run concurrently for optimal performance.
14+
*
15+
* @author Hardvan
16+
*/
17+
public final class GangScheduling {
18+
19+
static class Gang {
20+
String name;
21+
List<String> tasks;
22+
23+
Gang(String name) {
24+
this.name = name;
25+
this.tasks = new ArrayList<>();
26+
}
27+
28+
void addTask(String task) {
29+
tasks.add(task);
30+
}
31+
32+
List<String> getTasks() {
33+
return tasks;
34+
}
35+
}
36+
37+
private final Map<String, Gang> gangs;
38+
39+
public GangScheduling() {
40+
gangs = new HashMap<>();
41+
}
42+
43+
public void addGang(String gangName) {
44+
gangs.putIfAbsent(gangName, new Gang(gangName));
45+
}
46+
47+
public void addTaskToGang(String gangName, String task) {
48+
Gang gang = gangs.get(gangName);
49+
if (gang != null) {
50+
gang.addTask(task);
51+
}
52+
}
53+
54+
public Map<String, List<String>> getGangSchedules() {
55+
Map<String, List<String>> schedules = new HashMap<>();
56+
for (Gang gang : gangs.values()) {
57+
schedules.put(gang.name, gang.getTasks());
58+
}
59+
return schedules;
60+
}
61+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.thealgorithms.scheduling;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.util.List;
6+
import java.util.Map;
7+
import org.junit.jupiter.api.BeforeEach;
8+
import org.junit.jupiter.api.Test;
9+
10+
public class GangSchedulingTest {
11+
12+
private GangScheduling scheduler;
13+
14+
@BeforeEach
15+
public void setup() {
16+
scheduler = new GangScheduling();
17+
}
18+
19+
@Test
20+
public void testAddGangAndTask() {
21+
scheduler.addGang("Gang1");
22+
scheduler.addTaskToGang("Gang1", "Task1");
23+
Map<String, List<String>> expected = Map.of("Gang1", List.of("Task1"));
24+
assertEquals(expected, scheduler.getGangSchedules());
25+
}
26+
27+
@Test
28+
public void testMultipleGangs() {
29+
scheduler.addGang("Gang1");
30+
scheduler.addGang("Gang2");
31+
scheduler.addTaskToGang("Gang1", "Task1");
32+
scheduler.addTaskToGang("Gang2", "Task2");
33+
Map<String, List<String>> expected = Map.of("Gang1", List.of("Task1"), "Gang2", List.of("Task2"));
34+
assertEquals(expected, scheduler.getGangSchedules());
35+
}
36+
37+
@Test
38+
public void testGangWithMultipleTasks() {
39+
scheduler.addGang("Gang1");
40+
scheduler.addTaskToGang("Gang1", "Task1");
41+
scheduler.addTaskToGang("Gang1", "Task2");
42+
Map<String, List<String>> expected = Map.of("Gang1", List.of("Task1", "Task2"));
43+
assertEquals(expected, scheduler.getGangSchedules());
44+
}
45+
46+
@Test
47+
public void testEmptyGangSchedule() {
48+
scheduler.addGang("Gang1");
49+
Map<String, List<String>> expected = Map.of("Gang1", List.of());
50+
assertEquals(expected, scheduler.getGangSchedules());
51+
}
52+
}

0 commit comments

Comments
 (0)