Skip to content

Commit cfd3920

Browse files
committed
Add tickable object framework
1 parent b0ab187 commit cfd3920

File tree

3 files changed

+70
-0
lines changed

3 files changed

+70
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.embeddedt.modernfix.tickables;
2+
3+
import org.jetbrains.annotations.Nullable;
4+
5+
import java.util.function.Consumer;
6+
import java.util.function.Supplier;
7+
8+
public class LoadableTickableObject<T> implements TickableObject {
9+
private volatile int ticksInactive = 0;
10+
private final int timeout;
11+
private final Supplier<T> loader;
12+
private final Consumer<T> finalizer;
13+
private volatile T theObject = null;
14+
15+
public LoadableTickableObject(int timeout, Supplier<T> loader, Consumer<T> finalizer) {
16+
this(timeout, loader, finalizer, null);
17+
}
18+
19+
public LoadableTickableObject(int timeout, Supplier<T> loader, Consumer<T> finalizer, @Nullable T initialValue) {
20+
this.timeout = timeout;
21+
this.loader = loader;
22+
this.finalizer = finalizer;
23+
this.theObject = initialValue;
24+
}
25+
26+
public T get() {
27+
synchronized (this) {
28+
ticksInactive++;
29+
T obj = theObject;
30+
if(obj == null) {
31+
obj = loader.get();
32+
theObject = obj;
33+
}
34+
return obj;
35+
}
36+
}
37+
38+
public final void tick() {
39+
synchronized (this) {
40+
ticksInactive++;
41+
if(ticksInactive >= this.timeout) {
42+
finalizer.accept(theObject);
43+
theObject = null;
44+
}
45+
}
46+
}
47+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.embeddedt.modernfix.tickables;
2+
3+
public interface TickableObject {
4+
void tick();
5+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.embeddedt.modernfix.tickables;
2+
3+
import java.util.List;
4+
import java.util.concurrent.CopyOnWriteArrayList;
5+
6+
public class TickableObjectManager {
7+
private static final List<TickableObject> TICKABLE_OBJECT_LIST = new CopyOnWriteArrayList<>();
8+
9+
public static void register(TickableObject object) {
10+
TICKABLE_OBJECT_LIST.add(object);
11+
}
12+
13+
public static void runTick() {
14+
for(TickableObject o : TICKABLE_OBJECT_LIST) {
15+
o.tick();
16+
}
17+
}
18+
}

0 commit comments

Comments
 (0)