mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-06 09:06:51 +08:00
Add GangScheduling
algorithm (#5819)
This commit is contained in:
@ -533,6 +533,7 @@
|
|||||||
* [EDFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/EDFScheduling.java)
|
* [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)
|
* [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)
|
* [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)
|
* [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)
|
* [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)
|
* [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)
|
* [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)
|
* [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)
|
* [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)
|
* [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)
|
* [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)
|
* [LotterySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/LotterySchedulingTest.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<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;
|
||||||
|
}
|
||||||
|
}
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user