Add GangScheduling algorithm (#5819)

This commit is contained in:
Hardik Pawar
2024-10-26 12:55:20 +05:30
committed by GitHub
parent 1d19449931
commit f3c2be2c39
3 changed files with 115 additions and 0 deletions

View File

@ -533,6 +533,7 @@
* [EDFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/EDFScheduling.java)
* [FairShareScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/FairShareScheduling.java)
* [FCFSScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/FCFSScheduling.java)
* [GangScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/GangScheduling.java)
* [HighestResponseRatioNextScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/HighestResponseRatioNextScheduling.java)
* [JobSchedulingWithDeadline](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/JobSchedulingWithDeadline.java)
* [LotteryScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/LotteryScheduling.java)
@ -1134,6 +1135,7 @@
* [EDFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/EDFSchedulingTest.java)
* [FairShareSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/FairShareSchedulingTest.java)
* [FCFSSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/FCFSSchedulingTest.java)
* [GangSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/GangSchedulingTest.java)
* [HighestResponseRatioNextSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/HighestResponseRatioNextSchedulingTest.java)
* [JobSchedulingWithDeadlineTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/JobSchedulingWithDeadlineTest.java)
* [LotterySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/LotterySchedulingTest.java)

View File

@ -0,0 +1,61 @@
package com.thealgorithms.scheduling;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* GangScheduling groups related tasks (gangs) to run simultaneously on multiple processors.
* All tasks in a gang are executed together or not at all.
*
* Use Case: Parallel computing environments where multiple threads of a program
* need to run concurrently for optimal performance.
*
* @author Hardvan
*/
public final class GangScheduling {
static class Gang {
String name;
List<String> tasks;
Gang(String name) {
this.name = name;
this.tasks = new ArrayList<>();
}
void addTask(String task) {
tasks.add(task);
}
List<String> getTasks() {
return tasks;
}
}
private final Map<String, Gang> gangs;
public GangScheduling() {
gangs = new HashMap<>();
}
public void addGang(String gangName) {
gangs.putIfAbsent(gangName, new Gang(gangName));
}
public void addTaskToGang(String gangName, String task) {
Gang gang = gangs.get(gangName);
if (gang != null) {
gang.addTask(task);
}
}
public Map<String, List<String>> getGangSchedules() {
Map<String, List<String>> schedules = new HashMap<>();
for (Gang gang : gangs.values()) {
schedules.put(gang.name, gang.getTasks());
}
return schedules;
}
}

View File

@ -0,0 +1,52 @@
package com.thealgorithms.scheduling;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class GangSchedulingTest {
private GangScheduling scheduler;
@BeforeEach
public void setup() {
scheduler = new GangScheduling();
}
@Test
public void testAddGangAndTask() {
scheduler.addGang("Gang1");
scheduler.addTaskToGang("Gang1", "Task1");
Map<String, List<String>> expected = Map.of("Gang1", List.of("Task1"));
assertEquals(expected, scheduler.getGangSchedules());
}
@Test
public void testMultipleGangs() {
scheduler.addGang("Gang1");
scheduler.addGang("Gang2");
scheduler.addTaskToGang("Gang1", "Task1");
scheduler.addTaskToGang("Gang2", "Task2");
Map<String, List<String>> expected = Map.of("Gang1", List.of("Task1"), "Gang2", List.of("Task2"));
assertEquals(expected, scheduler.getGangSchedules());
}
@Test
public void testGangWithMultipleTasks() {
scheduler.addGang("Gang1");
scheduler.addTaskToGang("Gang1", "Task1");
scheduler.addTaskToGang("Gang1", "Task2");
Map<String, List<String>> expected = Map.of("Gang1", List.of("Task1", "Task2"));
assertEquals(expected, scheduler.getGangSchedules());
}
@Test
public void testEmptyGangSchedule() {
scheduler.addGang("Gang1");
Map<String, List<String>> expected = Map.of("Gang1", List.of());
assertEquals(expected, scheduler.getGangSchedules());
}
}