Skip to content
This repository was archived by the owner on May 26, 2024. It is now read-only.

Commit 1e1c610

Browse files
authored
Merge pull request #2 from Euphillya/rewrite-scheduler
Rewrite Scheduler
2 parents df95ab5 + bbbece3 commit 1e1c610

File tree

9 files changed

+417
-325
lines changed

9 files changed

+417
-325
lines changed

readme.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
## API
22

33
Bukkit/Spigot/Paper :
4+
45
```java
56
// Example Scheduler
67
Bukkit.getScheduler().runTask(this.plugin, () -> {
@@ -9,6 +10,7 @@ Bukkit.getScheduler().runTask(this.plugin, () -> {
910
```
1011

1112
Folia :
13+
1214
```java
1315
// Example Scheduler
1416
Bukkit.getGlobalRegionScheduler().run(this.plugin, task -> {
@@ -21,7 +23,9 @@ Entity.getScheduler().run(this.plugin, task -> {
2123
// code
2224
}, retired);
2325
```
26+
2427
Energie :
28+
2529
```java
2630
Energie energie = new Energie(this.plugin);
2731

src/main/java/fr/euphyllia/energie/Energie.java

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,14 @@
88

99
public class Energie {
1010

11-
private final Plugin plugin;
1211
private final ExecutorsScheduler executorsScheduler;
1312
private final LegacyScheduler legacyScheduler;
1413
private final FoliaScheduler foliaScheduler;
1514

1615
public Energie(Plugin javaPlugin) {
17-
this.plugin = javaPlugin;
18-
this.executorsScheduler = new ExecutorsScheduler(this.plugin);
19-
this.legacyScheduler = new LegacyScheduler(this.plugin);
20-
this.foliaScheduler = new FoliaScheduler(this.plugin);
16+
this.executorsScheduler = new ExecutorsScheduler(javaPlugin);
17+
this.legacyScheduler = new LegacyScheduler(javaPlugin);
18+
this.foliaScheduler = new FoliaScheduler(javaPlugin);
2119
}
2220

2321
public static boolean isFolia() {
@@ -28,28 +26,38 @@ public static boolean isPaper() {
2826
return hasClass("com.destroystokyo.paper.PaperConfig") || hasClass("io.papermc.paper.configuration.Configuration");
2927
}
3028

29+
private static boolean hasClass(String className) {
30+
try {
31+
Class.forName(className);
32+
return true;
33+
} catch (ClassNotFoundException exception) {
34+
return false;
35+
}
36+
}
37+
38+
public Scheduler getNativeScheduler() {
39+
return this.executorsScheduler;
40+
}
41+
42+
public Scheduler getMinecraftScheduler() {
43+
if (isFolia()) {
44+
return this.foliaScheduler;
45+
}
46+
return this.legacyScheduler;
47+
}
48+
49+
@Deprecated
3150
public Scheduler getScheduler(SchedulerSoft schedulerSoft) {
3251
if (schedulerSoft == SchedulerSoft.NATIVE) {
33-
return this.executorsScheduler;
52+
return this.getNativeScheduler();
3453
} else if (schedulerSoft == SchedulerSoft.MINECRAFT) {
35-
if (isFolia()) {
36-
return this.foliaScheduler;
37-
}
38-
return this.legacyScheduler;
54+
return this.getMinecraftScheduler();
3955
}
4056
throw new UnsupportedOperationException();
4157
}
4258

59+
@Deprecated
4360
public enum SchedulerSoft {
4461
NATIVE, MINECRAFT
4562
}
46-
47-
private static boolean hasClass(String className) {
48-
try {
49-
Class.forName(className);
50-
return true;
51-
} catch (ClassNotFoundException exception) {
52-
return false;
53-
}
54-
}
5563
}

src/main/java/fr/euphyllia/energie/executors/ExecutorsScheduler.java

Lines changed: 77 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.List;
1212
import java.util.Map;
1313
import java.util.concurrent.*;
14+
import java.util.concurrent.atomic.AtomicReference;
1415

1516
public class ExecutorsScheduler implements Scheduler {
1617

@@ -28,17 +29,33 @@ public ExecutorsScheduler(Plugin pluginBukkit) {
2829
}
2930

3031
@Override
31-
public @Nullable SchedulerTaskInter runAtFixedRate(@NotNull SchedulerType schedulerType, SchedulerCallBack callBack, long initialDelayTicks, long periodTicks) {
32+
public SchedulerTaskInter runAtFixedRate(@NotNull SchedulerType schedulerType, SchedulerCallBack callBack, long initialDelayTicks, long periodTicks) {
3233
if (!schedulerType.equals(SchedulerType.ASYNC)) {
3334
throw new UnsupportedOperationException();
3435
}
36+
final AtomicReference<ExecutorsSchedulerTask> executorsSchedulerTaskRef = new AtomicReference<>();
37+
3538
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
36-
executorService.scheduleAtFixedRate(() -> {
37-
ExecutorsSchedulerTask executorsScheduler = new ExecutorsSchedulerTask(plugin, executorService);
39+
40+
TaskRunnable taskRunnable = (executorsScheduler) -> {
3841
mapSchedulerTask.put(executorsScheduler.getTaskId(), executorsScheduler);
3942
callBack.run(executorsScheduler);
43+
};
44+
45+
executorsSchedulerTaskRef.set(new ExecutorsSchedulerTask(this.plugin, executorService));
46+
47+
executorService.scheduleAtFixedRate(() -> {
48+
taskRunnable.run(executorsSchedulerTaskRef.get());
4049
}, initialDelayTicks * 50, periodTicks * 50, TimeUnit.MILLISECONDS);
41-
return new ExecutorsSchedulerTask(plugin, executorService);
50+
51+
executorService.shutdown();
52+
try {
53+
executorService.awaitTermination(60, TimeUnit.SECONDS);
54+
} catch (InterruptedException e) {
55+
Thread.currentThread().interrupt();
56+
}
57+
58+
return executorsSchedulerTaskRef.get();
4259
}
4360

4461
@Override
@@ -61,13 +78,29 @@ public ExecutorsScheduler(Plugin pluginBukkit) {
6178
if (!schedulerType.equals(SchedulerType.ASYNC)) {
6279
throw new UnsupportedOperationException();
6380
}
81+
final AtomicReference<ExecutorsSchedulerTask> executorsSchedulerTaskRef = new AtomicReference<>();
82+
6483
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
65-
executorService.schedule(() -> {
66-
ExecutorsSchedulerTask executorsScheduler = new ExecutorsSchedulerTask(plugin, executorService);
84+
85+
TaskRunnable taskRunnable = (executorsScheduler) -> {
6786
mapSchedulerTask.put(executorsScheduler.getTaskId(), executorsScheduler);
6887
callBack.run(executorsScheduler);
88+
};
89+
90+
executorsSchedulerTaskRef.set(new ExecutorsSchedulerTask(this.plugin, executorService));
91+
92+
executorService.schedule(() -> {
93+
taskRunnable.run(executorsSchedulerTaskRef.get());
6994
}, delayTicks * 50, TimeUnit.MILLISECONDS);
70-
return new ExecutorsSchedulerTask(plugin, executorService);
95+
96+
executorService.shutdown();
97+
try {
98+
executorService.awaitTermination(60, TimeUnit.SECONDS);
99+
} catch (InterruptedException e) {
100+
Thread.currentThread().interrupt();
101+
}
102+
103+
return executorsSchedulerTaskRef.get();
71104
}
72105

73106
@Override
@@ -90,13 +123,29 @@ public ExecutorsScheduler(Plugin pluginBukkit) {
90123
if (!schedulerType.equals(SchedulerType.ASYNC)) {
91124
throw new UnsupportedOperationException();
92125
}
126+
final AtomicReference<ExecutorsSchedulerTask> executorsSchedulerTaskRef = new AtomicReference<>();
127+
93128
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
94-
executorService.execute(() -> {
95-
ExecutorsSchedulerTask executorsScheduler = new ExecutorsSchedulerTask(plugin, executorService);
129+
130+
TaskRunnable taskRunnable = (executorsScheduler) -> {
96131
mapSchedulerTask.put(executorsScheduler.getTaskId(), executorsScheduler);
97132
callBack.run(executorsScheduler);
133+
};
134+
135+
executorsSchedulerTaskRef.set(new ExecutorsSchedulerTask(this.plugin, executorService));
136+
137+
executorService.execute(() -> {
138+
taskRunnable.run(executorsSchedulerTaskRef.get());
98139
});
99-
return new ExecutorsSchedulerTask(plugin, executorService);
140+
141+
executorService.shutdown();
142+
try {
143+
executorService.awaitTermination(60, TimeUnit.SECONDS);
144+
} catch (InterruptedException e) {
145+
Thread.currentThread().interrupt();
146+
}
147+
148+
return executorsSchedulerTaskRef.get();
100149
}
101150

102151
@Override
@@ -169,47 +218,56 @@ public int scheduleSyncRepeating(@NotNull SchedulerType schedulerType, Entity en
169218
throw new UnsupportedOperationException();
170219
}
171220

172-
@Override @Deprecated
221+
@Override
222+
@Deprecated
173223
public void runAtFixedRate(@NotNull SchedulerType schedulerType, long initialDelayTicks, long periodTicks, SchedulerCallBack callBack) {
174224
this.runAtFixedRate(schedulerType, callBack, initialDelayTicks, periodTicks);
175225
}
176226

177-
@Override @Deprecated
227+
@Override
228+
@Deprecated
178229
public void runAtFixedRate(@NotNull SchedulerType schedulerType, @Nullable Object chunkOrLoc, long initialDelayTicks, long periodTicks, SchedulerCallBack callBack) {
179230
throw new UnsupportedOperationException();
180231
}
181232

182-
@Override @Deprecated
233+
@Override
234+
@Deprecated
183235
public void runAtFixedRate(@NotNull SchedulerType schedulerType, @Nullable Object chunkOrLocOrEntity, @Nullable Runnable retired, long initialDelayTicks, long periodTicks, SchedulerCallBack callBack) {
184236
throw new UnsupportedOperationException();
185237
}
186238

187-
@Override @Deprecated
239+
@Override
240+
@Deprecated
188241
public void runDelayed(@NotNull SchedulerType schedulerType, long delayTicks, SchedulerCallBack callBack) {
189242
this.runDelayed(schedulerType, callBack, delayTicks);
190243
}
191244

192-
@Override @Deprecated
245+
@Override
246+
@Deprecated
193247
public void runDelayed(@NotNull SchedulerType schedulerType, @Nullable Object chunkOrLoc, long delayTicks, SchedulerCallBack callBack) {
194248
throw new UnsupportedOperationException();
195249
}
196250

197-
@Override @Deprecated
251+
@Override
252+
@Deprecated
198253
public void runDelayed(@NotNull SchedulerType schedulerType, @Nullable Object chunkOrLocOrEntity, @Nullable Runnable retired, long delayTicks, SchedulerCallBack callBack) {
199254
throw new UnsupportedOperationException();
200255
}
201256

202-
@Override @Deprecated
257+
@Override
258+
@Deprecated
203259
public void execute(@NotNull SchedulerType schedulerType, SchedulerCallBack callBack) {
204260
this.runTask(schedulerType, callBack);
205261
}
206262

207-
@Override @Deprecated
263+
@Override
264+
@Deprecated
208265
public void execute(@NotNull SchedulerType schedulerType, @Nullable Object chunkOrLoc, SchedulerCallBack callBack) {
209266
throw new UnsupportedOperationException();
210267
}
211268

212-
@Override @Deprecated
269+
@Override
270+
@Deprecated
213271
public void execute(@NotNull SchedulerType schedulerType, @Nullable Object chunkOrLocOrEntity, @Nullable Runnable retired, SchedulerCallBack callBack) {
214272
throw new UnsupportedOperationException();
215273
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package fr.euphyllia.energie.executors;
2+
3+
@FunctionalInterface
4+
public interface TaskRunnable {
5+
void run(ExecutorsSchedulerTask executorsSchedulerTask);
6+
}

0 commit comments

Comments
 (0)