Skip to content

Commit 05c8399

Browse files
committed
Create a single place for all chunky thread/executors to be registered
Closes #1893 - Allows chunky to close them on shutdown without a System.exit() - Additionally provides an api to wait on all chunky threads to be joined.
1 parent 60478df commit 05c8399

14 files changed

Lines changed: 200 additions & 12 deletions

chunky/src/java/se/llbit/chunky/main/Chunky.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import se.llbit.log.Log;
4949
import se.llbit.log.Receiver;
5050
import se.llbit.util.TaskTracker;
51+
import se.llbit.util.concurrent.ChunkyThread;
5152

5253
import java.io.File;
5354
import java.io.FileInputStream;
@@ -241,6 +242,12 @@ public static void main(final String[] args) {
241242
exitCode = 2;
242243
}
243244
}
245+
246+
ChunkyThread.interruptAndJoinAll();
247+
ForkJoinPool commonThreads = Chunky.getCommonThreads();
248+
commonThreads.shutdownNow(); // ForkJoinPool doesn't return any tasks that were awaiting execution (all canceled).
249+
// We don't use the ForkJoinPool commonPool in chunky, but if we did there is no shutdown available so nothing changes.
250+
244251
if (exitCode != 0) {
245252
System.exit(exitCode);
246253
}

chunky/src/java/se/llbit/chunky/renderer/DefaultRenderManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import se.llbit.chunky.resources.BitmapImage;
2929
import se.llbit.log.Log;
3030
import se.llbit.math.ColorUtil;
31+
import se.llbit.util.concurrent.ChunkyThread;
3132
import se.llbit.util.TaskTracker;
3233

3334
import java.time.Duration;
@@ -52,7 +53,7 @@
5253
* <p>All available final renderers are stored in {@code renderers} and preview renderers
5354
* are stored in {@code previewRenderers}.
5455
*/
55-
public class DefaultRenderManager extends Thread implements RenderManager {
56+
public class DefaultRenderManager extends ChunkyThread implements RenderManager {
5657
/**
5758
* Map containing all the final render {@code Renderer}s. The renderer corresponding to
5859
* {@code getRendererName()} is used when a render is requested.

chunky/src/java/se/llbit/chunky/renderer/RenderWorkerPool.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package se.llbit.chunky.renderer;
1919

2020
import se.llbit.log.Log;
21+
import se.llbit.util.concurrent.ChunkyThread;
2122

2223
import java.util.ArrayList;
2324
import java.util.Random;
@@ -39,7 +40,7 @@ public interface Factory {
3940
RenderWorkerPool create(int threads, long seed);
4041
}
4142

42-
public static class RenderWorker extends Thread {
43+
public static class RenderWorker extends ChunkyThread {
4344
private final RenderWorkerPool pool;
4445

4546
public final Random random;

chunky/src/java/se/llbit/chunky/renderer/scene/AsynchronousSceneManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import se.llbit.chunky.world.RegionPosition;
2727
import se.llbit.chunky.world.World;
2828
import se.llbit.log.Log;
29+
import se.llbit.util.concurrent.ChunkyThread;
2930
import se.llbit.util.TaskTracker;
3031

3132
import java.io.File;
@@ -41,7 +42,7 @@
4142
*
4243
* @author Jesper Öqvist <jesper@llbit.se>
4344
*/
44-
public class AsynchronousSceneManager extends Thread implements SceneManager {
45+
public class AsynchronousSceneManager extends ChunkyThread implements SceneManager {
4546

4647
private final SynchronousSceneManager sceneManager;
4748
private final LinkedBlockingQueue<Runnable> taskQueue;

chunky/src/java/se/llbit/chunky/renderer/scene/Scene.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import se.llbit.nbt.Tag;
6363
import se.llbit.util.*;
6464
import se.llbit.util.annotation.NotNull;
65+
import se.llbit.util.concurrent.ChunkyThread;
6566
import se.llbit.util.io.PositionalInputStream;
6667
import se.llbit.util.io.ZipExport;
6768
import se.llbit.util.mojangapi.MinecraftProfile;
@@ -858,7 +859,7 @@ public synchronized void loadChunks(TaskTracker taskTracker, World world, Map<Re
858859
int[] cubeWorldBlocks = new int[16*16*16];
859860
int[] cubeWaterBlocks = new int[16*16*16];
860861

861-
ExecutorService executor = Executors.newSingleThreadExecutor();
862+
ExecutorService executor = ChunkyThread.addExecutorService(Executors::newSingleThreadExecutor);
862863

863864
ChunkData[] regionParsingDataArray = new ChunkData[MCRegion.CHUNKS_X * MCRegion.CHUNKS_Z];
864865
ChunkData[] chunkLoadingDataArray = new ChunkData[MCRegion.CHUNKS_X * MCRegion.CHUNKS_Z];

chunky/src/java/se/llbit/chunky/ui/ChunkMap.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import se.llbit.chunky.world.region.MCRegion;
5353
import se.llbit.log.Log;
5454
import se.llbit.math.*;
55+
import se.llbit.util.concurrent.ChunkyThread;
5556

5657
import java.awt.*;
5758
import java.io.File;
@@ -115,7 +116,7 @@ public class ChunkMap implements ChunkUpdateListener, ChunkViewListener, CameraV
115116
private volatile boolean scheduledUpdate = false;
116117
private volatile long lastRedraw = 0;
117118
private Runnable onViewDragged = () -> {};
118-
private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
119+
private final ScheduledExecutorService executor = ChunkyThread.addExecutorService(Executors::newSingleThreadScheduledExecutor);
119120

120121
private boolean shouldDrawPlayers = true;
121122

chunky/src/java/se/llbit/chunky/ui/ChunkyFx.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ public void stop() throws Exception {
8282
if(mainStage != null) {
8383
PersistentSettings.setWindowPosition(new WindowPosition(mainStage));
8484
}
85-
System.exit(0);
8685
}
8786

8887
public static void startChunkyUI(Chunky chunkyInstance) {

chunky/src/java/se/llbit/chunky/ui/controller/ResourcePackChooserController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import se.llbit.json.JsonParser;
5050
import se.llbit.log.Log;
5151
import se.llbit.util.MinecraftText;
52+
import se.llbit.util.concurrent.ChunkyThread;
5253

5354
import java.awt.*;
5455
import java.io.File;
@@ -451,7 +452,7 @@ public void populate(
451452

452453
private static class PackListItem {
453454

454-
private final static Executor PACK_PARSER_EXECUTOR = Executors.newSingleThreadExecutor();
455+
private final static Executor PACK_PARSER_EXECUTOR = ChunkyThread.addExecutorService(Executors::newSingleThreadExecutor);
455456

456457
private static PackListItem DEFAULT = null;
457458

chunky/src/java/se/llbit/chunky/ui/controller/SceneChooserController.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import se.llbit.json.JsonObject;
3737
import se.llbit.json.JsonParser;
3838
import se.llbit.log.Log;
39+
import se.llbit.util.concurrent.ChunkyThread;
3940

4041
import java.io.File;
4142
import java.io.FileInputStream;
@@ -64,6 +65,8 @@ public class SceneChooserController implements Initializable {
6465

6566
private Stage stage;
6667

68+
private static final Executor loadExecutor = ChunkyThread.addExecutorService(Executors::newSingleThreadExecutor);
69+
6770
private ChunkyFxController controller;
6871

6972
private static final HashMap<FileTimeCache, SceneListItem> sceneListCache = new HashMap<>();
@@ -219,7 +222,6 @@ public void setStage(Stage stage) {
219222

220223
private void populateSceneTable(File sceneDir) {
221224
this.sceneTbl.setPlaceholder(new Label("Loading scenes…"));
222-
Executor loadExecutor = Executors.newSingleThreadExecutor();
223225

224226
loadExecutor.execute(() -> {
225227
List<SceneListItem> scenes = new ArrayList<>();

chunky/src/java/se/llbit/chunky/world/ChunkTopographyUpdater.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package se.llbit.chunky.world;
1818

19+
import se.llbit.util.concurrent.ChunkyThread;
20+
1921
import java.util.HashSet;
2022
import java.util.Iterator;
2123
import java.util.Set;
@@ -25,7 +27,7 @@
2527
*
2628
* @author Jesper Öqvist (jesper@llbit.se)
2729
*/
28-
public class ChunkTopographyUpdater extends Thread {
30+
public class ChunkTopographyUpdater extends ChunkyThread {
2931

3032
private final Set<Chunk> queue = new HashSet<>();
3133

0 commit comments

Comments
 (0)