fix weird ModLauncher class loading issue when using forkjoin.commonpool()
This commit is contained in:
parent
359dddf5a2
commit
9583c1a69f
@ -42,6 +42,7 @@ public class ThreadPool implements Executor {
|
|||||||
public static final int DEFAULT_POOL_SIZE = defaultPoolSize();
|
public static final int DEFAULT_POOL_SIZE = defaultPoolSize();
|
||||||
|
|
||||||
private static final Object lock = new Object();
|
private static final Object lock = new Object();
|
||||||
|
private static final ForkJoinPool defaultPool = ThreadPool.createPool(2, "TFCore");
|
||||||
|
|
||||||
private static ThreadPool instance = new ThreadPool(defaultPoolSize());
|
private static ThreadPool instance = new ThreadPool(defaultPoolSize());
|
||||||
|
|
||||||
@ -49,13 +50,18 @@ public class ThreadPool implements Executor {
|
|||||||
private final ExecutorService service;
|
private final ExecutorService service;
|
||||||
|
|
||||||
private ThreadPool() {
|
private ThreadPool() {
|
||||||
this.service = ForkJoinPool.commonPool();
|
this.service = defaultPool;
|
||||||
this.poolSize = -1;
|
this.poolSize = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ThreadPool(int size) {
|
public ThreadPool(int size) {
|
||||||
this.poolSize = size;
|
this.poolSize = size;
|
||||||
this.service = ThreadPool.createService(size, "TerraForged");
|
this.service = ThreadPool.createExecutor(size, "TerraForged");
|
||||||
|
}
|
||||||
|
|
||||||
|
private ThreadPool(ForkJoinPool pool) {
|
||||||
|
this.service = pool;
|
||||||
|
this.poolSize = pool.getPoolSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void shutdown() {
|
public void shutdown() {
|
||||||
@ -116,6 +122,10 @@ public class ThreadPool implements Executor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ForkJoinPool getDefaultPool() {
|
||||||
|
return defaultPool;
|
||||||
|
}
|
||||||
|
|
||||||
public static void shutdownCurrent() {
|
public static void shutdownCurrent() {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
instance.shutdown();
|
instance.shutdown();
|
||||||
@ -129,7 +139,7 @@ public class ThreadPool implements Executor {
|
|||||||
return Math.max(1, (int) ((threads / 3F) * 2F));
|
return Math.max(1, (int) ((threads / 3F) * 2F));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ExecutorService createService(int size, String name) {
|
public static ExecutorService createExecutor(int size, String name) {
|
||||||
ThreadPoolExecutor service = new ThreadPoolExecutor(
|
ThreadPoolExecutor service = new ThreadPoolExecutor(
|
||||||
size,
|
size,
|
||||||
size,
|
size,
|
||||||
@ -141,4 +151,8 @@ public class ThreadPool implements Executor {
|
|||||||
service.allowCoreThreadTimeOut(true);
|
service.allowCoreThreadTimeOut(true);
|
||||||
return service;
|
return service;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ForkJoinPool createPool(int size, String name) {
|
||||||
|
return new ForkJoinPool(size, new WorkerFactory.ForkJoin(name), null, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
package com.terraforged.core.util.concurrent;
|
package com.terraforged.core.util.concurrent;
|
||||||
|
|
||||||
|
import java.util.concurrent.ForkJoinPool;
|
||||||
|
import java.util.concurrent.ForkJoinWorkerThread;
|
||||||
import java.util.concurrent.ThreadFactory;
|
import java.util.concurrent.ThreadFactory;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
// As DefaultThreadPool but with custom thread names
|
// As DefaultThreadPool but with custom thread names
|
||||||
public class WorkerFactory implements ThreadFactory {
|
public class WorkerFactory implements ThreadFactory {
|
||||||
|
|
||||||
private final String prefix;
|
protected final String prefix;
|
||||||
private final ThreadGroup group;
|
protected final ThreadGroup group;
|
||||||
private final AtomicInteger threadNumber = new AtomicInteger(1);
|
protected final AtomicInteger threadNumber = new AtomicInteger(1);
|
||||||
|
|
||||||
public WorkerFactory(String name) {
|
public WorkerFactory(String name) {
|
||||||
group = Thread.currentThread().getThreadGroup();
|
group = Thread.currentThread().getThreadGroup();
|
||||||
@ -22,4 +24,19 @@ public class WorkerFactory implements ThreadFactory {
|
|||||||
thread.setName(prefix + threadNumber.getAndIncrement());
|
thread.setName(prefix + threadNumber.getAndIncrement());
|
||||||
return thread;
|
return thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class ForkJoin extends WorkerFactory implements ForkJoinPool.ForkJoinWorkerThreadFactory {
|
||||||
|
|
||||||
|
public ForkJoin(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ForkJoinWorkerThread newThread(ForkJoinPool pool) {
|
||||||
|
ForkJoinWorkerThread thread = new ForkJoinWorkerThread(pool) {};
|
||||||
|
thread.setDaemon(true);
|
||||||
|
thread.setName(prefix + threadNumber.getAndIncrement());
|
||||||
|
return thread;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
package com.terraforged.core.util.concurrent.cache;
|
package com.terraforged.core.util.concurrent.cache;
|
||||||
|
|
||||||
|
import com.terraforged.core.util.concurrent.ThreadPool;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.Executor;
|
|
||||||
import java.util.concurrent.ForkJoinPool;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
@ -12,7 +12,6 @@ public class Cache<K, V extends ExpiringEntry> implements Runnable {
|
|||||||
|
|
||||||
private final long expireMS;
|
private final long expireMS;
|
||||||
private final long intervalMS;
|
private final long intervalMS;
|
||||||
private final Executor executor;
|
|
||||||
private final Map<K, V> map = new ConcurrentHashMap<>();
|
private final Map<K, V> map = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
private volatile long timestamp = 0L;
|
private volatile long timestamp = 0L;
|
||||||
@ -20,7 +19,6 @@ public class Cache<K, V extends ExpiringEntry> implements Runnable {
|
|||||||
public Cache(long expireTime, long interval, TimeUnit unit) {
|
public Cache(long expireTime, long interval, TimeUnit unit) {
|
||||||
this.expireMS = unit.toMillis(expireTime);
|
this.expireMS = unit.toMillis(expireTime);
|
||||||
this.intervalMS = unit.toMillis(interval);
|
this.intervalMS = unit.toMillis(interval);
|
||||||
this.executor = ForkJoinPool.commonPool();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public V computeIfAbsent(K k, Supplier<V> supplier) {
|
public V computeIfAbsent(K k, Supplier<V> supplier) {
|
||||||
@ -37,7 +35,7 @@ public class Cache<K, V extends ExpiringEntry> implements Runnable {
|
|||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
if (now - timestamp > intervalMS) {
|
if (now - timestamp > intervalMS) {
|
||||||
timestamp = now;
|
timestamp = now;
|
||||||
executor.execute(this);
|
ThreadPool.getDefaultPool().execute(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ package com.terraforged.core.world.river;
|
|||||||
|
|
||||||
import com.terraforged.core.cell.Cell;
|
import com.terraforged.core.cell.Cell;
|
||||||
import com.terraforged.core.region.Region;
|
import com.terraforged.core.region.Region;
|
||||||
|
import com.terraforged.core.util.concurrent.ThreadPool;
|
||||||
import com.terraforged.core.util.concurrent.cache.Cache;
|
import com.terraforged.core.util.concurrent.cache.Cache;
|
||||||
import com.terraforged.core.util.concurrent.cache.CacheEntry;
|
import com.terraforged.core.util.concurrent.cache.CacheEntry;
|
||||||
import com.terraforged.core.world.GeneratorContext;
|
import com.terraforged.core.world.GeneratorContext;
|
||||||
@ -34,7 +35,6 @@ import com.terraforged.core.world.heightmap.Heightmap;
|
|||||||
import com.terraforged.core.world.terrain.Terrain;
|
import com.terraforged.core.world.terrain.Terrain;
|
||||||
import me.dags.noise.util.NoiseUtil;
|
import me.dags.noise.util.NoiseUtil;
|
||||||
|
|
||||||
import java.util.concurrent.ForkJoinPool;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class RiverManager {
|
public class RiverManager {
|
||||||
@ -148,6 +148,6 @@ public class RiverManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private CacheEntry<RiverRegion> generateRegion(int rx, int rz) {
|
private CacheEntry<RiverRegion> generateRegion(int rx, int rz) {
|
||||||
return CacheEntry.supplyAsync(() -> new RiverRegion(rx, rz, heightmap, context, riverContext), ForkJoinPool.commonPool());
|
return CacheEntry.supplyAsync(() -> new RiverRegion(rx, rz, heightmap, context, riverContext), ThreadPool.getDefaultPool());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
mod_version=0.0.6
|
mod_version=0.0.7
|
||||||
mc_version=1.15.2
|
mc_version=1.15.2
|
||||||
forge_version=31.1.1
|
forge_version=31.1.1
|
||||||
mcp_channel=snapshot
|
mcp_channel=snapshot
|
||||||
|
Loading…
Reference in New Issue
Block a user