From 450802a2333535d10482fb7c1eeaad761d4b5183 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Mon, 14 Oct 2024 19:10:35 +0530 Subject: [PATCH 1/2] feat: Add `GangScheduling` new algorithm with Junit tests --- .../scheduling/GangScheduling.java | 61 +++++++++++++++++++ .../scheduling/GangSchedulingTest.java | 52 ++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 src/main/java/com/thealgorithms/scheduling/GangScheduling.java create mode 100644 src/test/java/com/thealgorithms/scheduling/GangSchedulingTest.java diff --git a/src/main/java/com/thealgorithms/scheduling/GangScheduling.java b/src/main/java/com/thealgorithms/scheduling/GangScheduling.java new file mode 100644 index 000000000000..ac1ce8ddd6ae --- /dev/null +++ b/src/main/java/com/thealgorithms/scheduling/GangScheduling.java @@ -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 tasks; + + Gang(String name) { + this.name = name; + this.tasks = new ArrayList<>(); + } + + void addTask(String task) { + tasks.add(task); + } + + List getTasks() { + return tasks; + } + } + + private final Map 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> getGangSchedules() { + Map> schedules = new HashMap<>(); + for (Gang gang : gangs.values()) { + schedules.put(gang.name, gang.getTasks()); + } + return schedules; + } +} diff --git a/src/test/java/com/thealgorithms/scheduling/GangSchedulingTest.java b/src/test/java/com/thealgorithms/scheduling/GangSchedulingTest.java new file mode 100644 index 000000000000..2e1bb4cd0e20 --- /dev/null +++ b/src/test/java/com/thealgorithms/scheduling/GangSchedulingTest.java @@ -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> 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> 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> expected = Map.of("Gang1", List.of("Task1", "Task2")); + assertEquals(expected, scheduler.getGangSchedules()); + } + + @Test + public void testEmptyGangSchedule() { + scheduler.addGang("Gang1"); + Map> expected = Map.of("Gang1", List.of()); + assertEquals(expected, scheduler.getGangSchedules()); + } +} From 7380e47a0c5421f8dc8100174d822570390226d0 Mon Sep 17 00:00:00 2001 From: Hardvan Date: Mon, 14 Oct 2024 13:40:53 +0000 Subject: [PATCH 2/2] Update directory --- DIRECTORY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 4c454088088b..d8c3600c0f1a 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -513,6 +513,7 @@ * [SSFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/SSFScheduling.java) * [EDFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/EDFScheduling.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) @@ -1064,6 +1065,7 @@ * [SSFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/SSFSchedulingTest.java) * [EDFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/EDFSchedulingTest.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)