Skip to content
This repository was archived by the owner on Aug 12, 2025. It is now read-only.

Commit 31610ca

Browse files
committed
Add AdvancedTaskScheduler and TaskBuilder for enhanced task scheduling capabilities
1 parent 64e0cd1 commit 31610ca

3 files changed

Lines changed: 155 additions & 0 deletions

File tree

src/main/java/gg/nextforge/scheduler/CoreScheduler.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package gg.nextforge.scheduler;
22

3+
import gg.nextforge.scheduler.advanced.AdvancedTaskScheduler;
34
import lombok.Getter;
45

56
import java.util.Map;
@@ -13,6 +14,8 @@
1314
public class CoreScheduler {
1415

1516
private static CoreScheduler instance;
17+
@Getter
18+
private static AdvancedTaskScheduler advancedScheduler;
1619

1720
@Getter
1821
private static final Map<Integer, ScheduledTask> activeTasks = new ConcurrentHashMap<>();
@@ -22,6 +25,7 @@ public class CoreScheduler {
2225

2326
public CoreScheduler() {
2427
this.executorService = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors());
28+
this.advancedScheduler = new AdvancedTaskScheduler();
2529
instance = this;
2630
}
2731

@@ -91,4 +95,5 @@ private ScheduledTask scheduleRepeating(Runnable task, long delayTicks, long per
9195
private long ticksToMillis(long ticks) {
9296
return ticks * 50L; // 20 ticks = 1 second
9397
}
98+
9499
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package gg.nextforge.scheduler.advanced;
2+
3+
import java.util.concurrent.*;
4+
import java.util.function.Consumer;
5+
import java.util.logging.Logger;
6+
7+
public class AdvancedTaskScheduler {
8+
9+
private static final Logger LOGGER = Logger.getLogger("AdvancedTaskScheduler");
10+
11+
private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(4);
12+
private final ExecutorService asyncExecutor = Executors.newCachedThreadPool();
13+
14+
public ScheduledFuture<?> runLater(Runnable task, long delayMillis) {
15+
return executor.schedule(safe(task), delayMillis, TimeUnit.MILLISECONDS);
16+
}
17+
18+
public ScheduledFuture<?> runRepeating(Runnable task, long initialDelay, long period) {
19+
return executor.scheduleAtFixedRate(safe(task), initialDelay, period, TimeUnit.MILLISECONDS);
20+
}
21+
22+
public Future<?> runAsync(Runnable task) {
23+
return asyncExecutor.submit(safe(task));
24+
}
25+
26+
public <T> Future<T> supplyAsync(Callable<T> task) {
27+
return asyncExecutor.submit(task);
28+
}
29+
30+
public <T> void supplyAsync(Callable<T> task, Consumer<T> resultHandler, Consumer<Throwable> errorHandler) {
31+
asyncExecutor.submit(() -> {
32+
try {
33+
T result = task.call();
34+
resultHandler.accept(result);
35+
} catch (Throwable t) {
36+
errorHandler.accept(t);
37+
}
38+
});
39+
}
40+
41+
public void shutdown() {
42+
executor.shutdownNow();
43+
asyncExecutor.shutdownNow();
44+
}
45+
46+
private Runnable safe(Runnable task) {
47+
return () -> {
48+
try {
49+
task.run();
50+
} catch (Throwable t) {
51+
LOGGER.severe("Task execution failed: " + t.getMessage());
52+
t.printStackTrace();
53+
}
54+
};
55+
}
56+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package gg.nextforge.scheduler.advanced;
2+
3+
import java.util.concurrent.*;
4+
import java.util.function.Consumer;
5+
import java.util.function.Supplier;
6+
7+
public class TaskBuilder<T> {
8+
9+
private boolean async = true;
10+
private boolean repeating = false;
11+
12+
private long delay = 0;
13+
private long period = 0;
14+
15+
private Supplier<T> supplier;
16+
private Consumer<T> callback;
17+
private Consumer<Throwable> errorHandler;
18+
19+
private AdvancedTaskScheduler scheduler;
20+
21+
private TaskBuilder(AdvancedTaskScheduler scheduler) {
22+
this.scheduler = scheduler;
23+
}
24+
25+
public static <T> TaskBuilder<T> create(AdvancedTaskScheduler scheduler) {
26+
return new TaskBuilder<>(scheduler);
27+
}
28+
29+
public TaskBuilder<T> async(boolean async) {
30+
this.async = async;
31+
return this;
32+
}
33+
34+
public TaskBuilder<T> delay(long millis) {
35+
this.delay = millis;
36+
return this;
37+
}
38+
39+
public TaskBuilder<T> period(long millis) {
40+
this.repeating = true;
41+
this.period = millis;
42+
return this;
43+
}
44+
45+
public TaskBuilder<T> supplier(Supplier<T> supplier) {
46+
this.supplier = supplier;
47+
return this;
48+
}
49+
50+
public TaskBuilder<T> onResult(Consumer<T> callback) {
51+
this.callback = callback;
52+
return this;
53+
}
54+
55+
public TaskBuilder<T> onError(Consumer<Throwable> errorHandler) {
56+
this.errorHandler = errorHandler;
57+
return this;
58+
}
59+
60+
public Future<?> schedule() {
61+
if (supplier == null) throw new IllegalStateException("No task supplier defined!");
62+
63+
Callable<T> callable = () -> {
64+
try {
65+
return supplier.get();
66+
} catch (Throwable t) {
67+
if (errorHandler != null) errorHandler.accept(t);
68+
else t.printStackTrace();
69+
return null;
70+
}
71+
};
72+
73+
Runnable task = () -> {
74+
try {
75+
T result = callable.call();
76+
if (callback != null && result != null) callback.accept(result);
77+
} catch (Exception e) {
78+
if (errorHandler != null) errorHandler.accept(e);
79+
else e.printStackTrace();
80+
}
81+
};
82+
83+
if (repeating) {
84+
return scheduler.runRepeating(task, delay, period);
85+
} else if (delay > 0) {
86+
return scheduler.runLater(task, delay);
87+
} else if (async) {
88+
return scheduler.runAsync(task);
89+
} else {
90+
task.run();
91+
return null;
92+
}
93+
}
94+
}

0 commit comments

Comments
 (0)