Addition of ThreadsForLoading configuration.

This commit is contained in:
MobiusDevelopment
2019-04-05 18:30:14 +00:00
parent 955c2eff68
commit fc6c31df53
59 changed files with 1144 additions and 492 deletions
+4
View File
@@ -145,6 +145,10 @@ ThreadsPerInstantThreadPool = 2
# Default: 2 # Default: 2
UrgentPacketThreadCoreSize = 2 UrgentPacketThreadCoreSize = 2
# Use threads to decrease startup time.
# Default: False
ThreadsForLoading = False
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Dead Lock Detector (separate thread for detecting deadlocks) # Dead Lock Detector (separate thread for detecting deadlocks)
@@ -430,6 +430,7 @@ public final class Config
public static int INSTANT_THREAD_POOL_COUNT; public static int INSTANT_THREAD_POOL_COUNT;
public static int THREADS_PER_INSTANT_THREAD_POOL; public static int THREADS_PER_INSTANT_THREAD_POOL;
public static int IO_PACKET_THREAD_CORE_SIZE; public static int IO_PACKET_THREAD_CORE_SIZE;
public static boolean THREADS_FOR_LOADING;
public static boolean DEADLOCK_DETECTOR; public static boolean DEADLOCK_DETECTOR;
public static int DEADLOCK_CHECK_INTERVAL; public static int DEADLOCK_CHECK_INTERVAL;
public static boolean RESTART_ON_DEADLOCK; public static boolean RESTART_ON_DEADLOCK;
@@ -1284,6 +1285,7 @@ public final class Config
} }
THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2); THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2);
IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2); IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2);
THREADS_FOR_LOADING = serverSettings.getBoolean("ThreadsForLoading", false);
DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true); DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true);
DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20); DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20);
@@ -165,29 +165,47 @@ public interface IXmlReader
return false; return false;
} }
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>(); if (Config.THREADS_FOR_LOADING)
final File[] listOfFiles = dir.listFiles();
for (File f : listOfFiles)
{ {
if (recursive && f.isDirectory()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
parseDirectory(f, recursive); if (recursive && file.isDirectory())
}
else if (getCurrentFileFilter().accept(f))
{
jobs.add(ThreadPool.schedule(() ->
{ {
parseFile(f); parseDirectory(file, recursive);
}, 0)); }
else if (getCurrentFileFilter().accept(file))
{
jobs.add(ThreadPool.schedule(() ->
{
parseFile(file);
}, 0));
}
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
} }
} }
while (!jobs.isEmpty()) else
{ {
for (ScheduledFuture<?> job : jobs) final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) if (recursive && file.isDirectory())
{ {
jobs.remove(job); parseDirectory(file, recursive);
}
else if (getCurrentFileFilter().accept(file))
{
parseFile(file);
} }
} }
} }
@@ -95,28 +95,44 @@ public class SpawnsData implements IXmlReader
} }
LOGGER.info(getClass().getSimpleName() + ": Initializing spawns..."); LOGGER.info(getClass().getSimpleName() + ": Initializing spawns...");
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns) if (Config.THREADS_FOR_LOADING)
{ {
if (template.isSpawningByDefault()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns)
{ {
jobs.add(ThreadPool.schedule(() -> if (template.isSpawningByDefault())
{ {
template.spawnAll(null); jobs.add(ThreadPool.schedule(() ->
template.notifyActivate(); {
}, 0)); template.spawnAll(null);
template.notifyActivate();
}, 0));
}
} }
} while (!jobs.isEmpty())
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) for (ScheduledFuture<?> job : jobs)
{ {
jobs.remove(job); if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
} }
else
{
for (SpawnTemplate template : _spawns)
{
if (template.isSpawningByDefault())
{
template.spawnAll(null);
template.notifyActivate();
}
}
}
LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!"); LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!");
} }
@@ -69,26 +69,40 @@ public class DocumentEngine
public List<Item> loadItems() public List<Item> loadItems()
{ {
final List<Item> list = new CopyOnWriteArrayList<>(); final List<Item> list = new CopyOnWriteArrayList<>();
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles) if (Config.THREADS_FOR_LOADING)
{ {
jobs.add(ThreadPool.schedule(() -> final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles)
{
jobs.add(ThreadPool.schedule(() ->
{
final DocumentItem document = new DocumentItem(file);
document.parse();
list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
}
}
else
{
for (File file : _itemFiles)
{ {
final DocumentItem document = new DocumentItem(file); final DocumentItem document = new DocumentItem(file);
document.parse(); document.parse();
list.addAll(document.getItemList()); list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
return list; return list;
} }
@@ -145,6 +145,10 @@ ThreadsPerInstantThreadPool = 2
# Default: 2 # Default: 2
UrgentPacketThreadCoreSize = 2 UrgentPacketThreadCoreSize = 2
# Use threads to decrease startup time.
# Default: False
ThreadsForLoading = False
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Dead Lock Detector (separate thread for detecting deadlocks) # Dead Lock Detector (separate thread for detecting deadlocks)
@@ -436,6 +436,7 @@ public final class Config
public static int INSTANT_THREAD_POOL_COUNT; public static int INSTANT_THREAD_POOL_COUNT;
public static int THREADS_PER_INSTANT_THREAD_POOL; public static int THREADS_PER_INSTANT_THREAD_POOL;
public static int IO_PACKET_THREAD_CORE_SIZE; public static int IO_PACKET_THREAD_CORE_SIZE;
public static boolean THREADS_FOR_LOADING;
public static boolean DEADLOCK_DETECTOR; public static boolean DEADLOCK_DETECTOR;
public static int DEADLOCK_CHECK_INTERVAL; public static int DEADLOCK_CHECK_INTERVAL;
public static boolean RESTART_ON_DEADLOCK; public static boolean RESTART_ON_DEADLOCK;
@@ -1291,6 +1292,7 @@ public final class Config
} }
THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2); THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2);
IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2); IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2);
THREADS_FOR_LOADING = serverSettings.getBoolean("ThreadsForLoading", false);
DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true); DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true);
DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20); DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20);
@@ -165,29 +165,47 @@ public interface IXmlReader
return false; return false;
} }
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>(); if (Config.THREADS_FOR_LOADING)
final File[] listOfFiles = dir.listFiles();
for (File f : listOfFiles)
{ {
if (recursive && f.isDirectory()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
parseDirectory(f, recursive); if (recursive && file.isDirectory())
}
else if (getCurrentFileFilter().accept(f))
{
jobs.add(ThreadPool.schedule(() ->
{ {
parseFile(f); parseDirectory(file, recursive);
}, 0)); }
else if (getCurrentFileFilter().accept(file))
{
jobs.add(ThreadPool.schedule(() ->
{
parseFile(file);
}, 0));
}
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
} }
} }
while (!jobs.isEmpty()) else
{ {
for (ScheduledFuture<?> job : jobs) final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) if (recursive && file.isDirectory())
{ {
jobs.remove(job); parseDirectory(file, recursive);
}
else if (getCurrentFileFilter().accept(file))
{
parseFile(file);
} }
} }
} }
@@ -95,28 +95,44 @@ public class SpawnsData implements IXmlReader
} }
LOGGER.info(getClass().getSimpleName() + ": Initializing spawns..."); LOGGER.info(getClass().getSimpleName() + ": Initializing spawns...");
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns) if (Config.THREADS_FOR_LOADING)
{ {
if (template.isSpawningByDefault()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns)
{ {
jobs.add(ThreadPool.schedule(() -> if (template.isSpawningByDefault())
{ {
template.spawnAll(null); jobs.add(ThreadPool.schedule(() ->
template.notifyActivate(); {
}, 0)); template.spawnAll(null);
template.notifyActivate();
}, 0));
}
} }
} while (!jobs.isEmpty())
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) for (ScheduledFuture<?> job : jobs)
{ {
jobs.remove(job); if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
} }
else
{
for (SpawnTemplate template : _spawns)
{
if (template.isSpawningByDefault())
{
template.spawnAll(null);
template.notifyActivate();
}
}
}
LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!"); LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!");
} }
@@ -69,26 +69,40 @@ public class DocumentEngine
public List<Item> loadItems() public List<Item> loadItems()
{ {
final List<Item> list = new CopyOnWriteArrayList<>(); final List<Item> list = new CopyOnWriteArrayList<>();
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles) if (Config.THREADS_FOR_LOADING)
{ {
jobs.add(ThreadPool.schedule(() -> final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles)
{
jobs.add(ThreadPool.schedule(() ->
{
final DocumentItem document = new DocumentItem(file);
document.parse();
list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
}
}
else
{
for (File file : _itemFiles)
{ {
final DocumentItem document = new DocumentItem(file); final DocumentItem document = new DocumentItem(file);
document.parse(); document.parse();
list.addAll(document.getItemList()); list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
return list; return list;
} }
+4
View File
@@ -145,6 +145,10 @@ ThreadsPerInstantThreadPool = 2
# Default: 2 # Default: 2
UrgentPacketThreadCoreSize = 2 UrgentPacketThreadCoreSize = 2
# Use threads to decrease startup time.
# Default: False
ThreadsForLoading = False
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Dead Lock Detector (separate thread for detecting deadlocks) # Dead Lock Detector (separate thread for detecting deadlocks)
@@ -436,6 +436,7 @@ public final class Config
public static int INSTANT_THREAD_POOL_COUNT; public static int INSTANT_THREAD_POOL_COUNT;
public static int THREADS_PER_INSTANT_THREAD_POOL; public static int THREADS_PER_INSTANT_THREAD_POOL;
public static int IO_PACKET_THREAD_CORE_SIZE; public static int IO_PACKET_THREAD_CORE_SIZE;
public static boolean THREADS_FOR_LOADING;
public static boolean DEADLOCK_DETECTOR; public static boolean DEADLOCK_DETECTOR;
public static int DEADLOCK_CHECK_INTERVAL; public static int DEADLOCK_CHECK_INTERVAL;
public static boolean RESTART_ON_DEADLOCK; public static boolean RESTART_ON_DEADLOCK;
@@ -1299,6 +1300,7 @@ public final class Config
} }
THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2); THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2);
IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2); IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2);
THREADS_FOR_LOADING = serverSettings.getBoolean("ThreadsForLoading", false);
DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true); DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true);
DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20); DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20);
@@ -165,29 +165,47 @@ public interface IXmlReader
return false; return false;
} }
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>(); if (Config.THREADS_FOR_LOADING)
final File[] listOfFiles = dir.listFiles();
for (File f : listOfFiles)
{ {
if (recursive && f.isDirectory()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
parseDirectory(f, recursive); if (recursive && file.isDirectory())
}
else if (getCurrentFileFilter().accept(f))
{
jobs.add(ThreadPool.schedule(() ->
{ {
parseFile(f); parseDirectory(file, recursive);
}, 0)); }
else if (getCurrentFileFilter().accept(file))
{
jobs.add(ThreadPool.schedule(() ->
{
parseFile(file);
}, 0));
}
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
} }
} }
while (!jobs.isEmpty()) else
{ {
for (ScheduledFuture<?> job : jobs) final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) if (recursive && file.isDirectory())
{ {
jobs.remove(job); parseDirectory(file, recursive);
}
else if (getCurrentFileFilter().accept(file))
{
parseFile(file);
} }
} }
} }
@@ -95,28 +95,44 @@ public class SpawnsData implements IXmlReader
} }
LOGGER.info(getClass().getSimpleName() + ": Initializing spawns..."); LOGGER.info(getClass().getSimpleName() + ": Initializing spawns...");
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns) if (Config.THREADS_FOR_LOADING)
{ {
if (template.isSpawningByDefault()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns)
{ {
jobs.add(ThreadPool.schedule(() -> if (template.isSpawningByDefault())
{ {
template.spawnAll(null); jobs.add(ThreadPool.schedule(() ->
template.notifyActivate(); {
}, 0)); template.spawnAll(null);
template.notifyActivate();
}, 0));
}
} }
} while (!jobs.isEmpty())
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) for (ScheduledFuture<?> job : jobs)
{ {
jobs.remove(job); if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
} }
else
{
for (SpawnTemplate template : _spawns)
{
if (template.isSpawningByDefault())
{
template.spawnAll(null);
template.notifyActivate();
}
}
}
LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!"); LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!");
} }
@@ -69,26 +69,40 @@ public class DocumentEngine
public List<Item> loadItems() public List<Item> loadItems()
{ {
final List<Item> list = new CopyOnWriteArrayList<>(); final List<Item> list = new CopyOnWriteArrayList<>();
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles) if (Config.THREADS_FOR_LOADING)
{ {
jobs.add(ThreadPool.schedule(() -> final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles)
{
jobs.add(ThreadPool.schedule(() ->
{
final DocumentItem document = new DocumentItem(file);
document.parse();
list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
}
}
else
{
for (File file : _itemFiles)
{ {
final DocumentItem document = new DocumentItem(file); final DocumentItem document = new DocumentItem(file);
document.parse(); document.parse();
list.addAll(document.getItemList()); list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
return list; return list;
} }
@@ -145,6 +145,10 @@ ThreadsPerInstantThreadPool = 2
# Default: 2 # Default: 2
UrgentPacketThreadCoreSize = 2 UrgentPacketThreadCoreSize = 2
# Use threads to decrease startup time.
# Default: False
ThreadsForLoading = False
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Dead Lock Detector (separate thread for detecting deadlocks) # Dead Lock Detector (separate thread for detecting deadlocks)
@@ -430,6 +430,7 @@ public final class Config
public static int INSTANT_THREAD_POOL_COUNT; public static int INSTANT_THREAD_POOL_COUNT;
public static int THREADS_PER_INSTANT_THREAD_POOL; public static int THREADS_PER_INSTANT_THREAD_POOL;
public static int IO_PACKET_THREAD_CORE_SIZE; public static int IO_PACKET_THREAD_CORE_SIZE;
public static boolean THREADS_FOR_LOADING;
public static boolean DEADLOCK_DETECTOR; public static boolean DEADLOCK_DETECTOR;
public static int DEADLOCK_CHECK_INTERVAL; public static int DEADLOCK_CHECK_INTERVAL;
public static boolean RESTART_ON_DEADLOCK; public static boolean RESTART_ON_DEADLOCK;
@@ -1292,6 +1293,7 @@ public final class Config
} }
THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2); THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2);
IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2); IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2);
THREADS_FOR_LOADING = serverSettings.getBoolean("ThreadsForLoading", false);
DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true); DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true);
DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20); DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20);
@@ -165,29 +165,47 @@ public interface IXmlReader
return false; return false;
} }
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>(); if (Config.THREADS_FOR_LOADING)
final File[] listOfFiles = dir.listFiles();
for (File f : listOfFiles)
{ {
if (recursive && f.isDirectory()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
parseDirectory(f, recursive); if (recursive && file.isDirectory())
}
else if (getCurrentFileFilter().accept(f))
{
jobs.add(ThreadPool.schedule(() ->
{ {
parseFile(f); parseDirectory(file, recursive);
}, 0)); }
else if (getCurrentFileFilter().accept(file))
{
jobs.add(ThreadPool.schedule(() ->
{
parseFile(file);
}, 0));
}
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
} }
} }
while (!jobs.isEmpty()) else
{ {
for (ScheduledFuture<?> job : jobs) final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) if (recursive && file.isDirectory())
{ {
jobs.remove(job); parseDirectory(file, recursive);
}
else if (getCurrentFileFilter().accept(file))
{
parseFile(file);
} }
} }
} }
@@ -95,28 +95,44 @@ public class SpawnsData implements IXmlReader
} }
LOGGER.info(getClass().getSimpleName() + ": Initializing spawns..."); LOGGER.info(getClass().getSimpleName() + ": Initializing spawns...");
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns) if (Config.THREADS_FOR_LOADING)
{ {
if (template.isSpawningByDefault()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns)
{ {
jobs.add(ThreadPool.schedule(() -> if (template.isSpawningByDefault())
{ {
template.spawnAll(null); jobs.add(ThreadPool.schedule(() ->
template.notifyActivate(); {
}, 0)); template.spawnAll(null);
template.notifyActivate();
}, 0));
}
} }
} while (!jobs.isEmpty())
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) for (ScheduledFuture<?> job : jobs)
{ {
jobs.remove(job); if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
} }
else
{
for (SpawnTemplate template : _spawns)
{
if (template.isSpawningByDefault())
{
template.spawnAll(null);
template.notifyActivate();
}
}
}
LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!"); LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!");
} }
@@ -69,26 +69,40 @@ public class DocumentEngine
public List<Item> loadItems() public List<Item> loadItems()
{ {
final List<Item> list = new CopyOnWriteArrayList<>(); final List<Item> list = new CopyOnWriteArrayList<>();
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles) if (Config.THREADS_FOR_LOADING)
{ {
jobs.add(ThreadPool.schedule(() -> final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles)
{
jobs.add(ThreadPool.schedule(() ->
{
final DocumentItem document = new DocumentItem(file);
document.parse();
list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
}
}
else
{
for (File file : _itemFiles)
{ {
final DocumentItem document = new DocumentItem(file); final DocumentItem document = new DocumentItem(file);
document.parse(); document.parse();
list.addAll(document.getItemList()); list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
return list; return list;
} }
+4
View File
@@ -145,6 +145,10 @@ ThreadsPerInstantThreadPool = 2
# Default: 2 # Default: 2
UrgentPacketThreadCoreSize = 2 UrgentPacketThreadCoreSize = 2
# Use threads to decrease startup time.
# Default: False
ThreadsForLoading = False
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Dead Lock Detector (separate thread for detecting deadlocks) # Dead Lock Detector (separate thread for detecting deadlocks)
@@ -425,6 +425,7 @@ public final class Config
public static int INSTANT_THREAD_POOL_COUNT; public static int INSTANT_THREAD_POOL_COUNT;
public static int THREADS_PER_INSTANT_THREAD_POOL; public static int THREADS_PER_INSTANT_THREAD_POOL;
public static int IO_PACKET_THREAD_CORE_SIZE; public static int IO_PACKET_THREAD_CORE_SIZE;
public static boolean THREADS_FOR_LOADING;
public static boolean DEADLOCK_DETECTOR; public static boolean DEADLOCK_DETECTOR;
public static int DEADLOCK_CHECK_INTERVAL; public static int DEADLOCK_CHECK_INTERVAL;
public static boolean RESTART_ON_DEADLOCK; public static boolean RESTART_ON_DEADLOCK;
@@ -1287,6 +1288,7 @@ public final class Config
} }
THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2); THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2);
IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2); IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2);
THREADS_FOR_LOADING = serverSettings.getBoolean("ThreadsForLoading", false);
DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true); DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true);
DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20); DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20);
@@ -165,29 +165,47 @@ public interface IXmlReader
return false; return false;
} }
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>(); if (Config.THREADS_FOR_LOADING)
final File[] listOfFiles = dir.listFiles();
for (File f : listOfFiles)
{ {
if (recursive && f.isDirectory()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
parseDirectory(f, recursive); if (recursive && file.isDirectory())
}
else if (getCurrentFileFilter().accept(f))
{
jobs.add(ThreadPool.schedule(() ->
{ {
parseFile(f); parseDirectory(file, recursive);
}, 0)); }
else if (getCurrentFileFilter().accept(file))
{
jobs.add(ThreadPool.schedule(() ->
{
parseFile(file);
}, 0));
}
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
} }
} }
while (!jobs.isEmpty()) else
{ {
for (ScheduledFuture<?> job : jobs) final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) if (recursive && file.isDirectory())
{ {
jobs.remove(job); parseDirectory(file, recursive);
}
else if (getCurrentFileFilter().accept(file))
{
parseFile(file);
} }
} }
} }
@@ -95,28 +95,44 @@ public class SpawnsData implements IXmlReader
} }
LOGGER.info(getClass().getSimpleName() + ": Initializing spawns..."); LOGGER.info(getClass().getSimpleName() + ": Initializing spawns...");
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns) if (Config.THREADS_FOR_LOADING)
{ {
if (template.isSpawningByDefault()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns)
{ {
jobs.add(ThreadPool.schedule(() -> if (template.isSpawningByDefault())
{ {
template.spawnAll(null); jobs.add(ThreadPool.schedule(() ->
template.notifyActivate(); {
}, 0)); template.spawnAll(null);
template.notifyActivate();
}, 0));
}
} }
} while (!jobs.isEmpty())
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) for (ScheduledFuture<?> job : jobs)
{ {
jobs.remove(job); if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
} }
else
{
for (SpawnTemplate template : _spawns)
{
if (template.isSpawningByDefault())
{
template.spawnAll(null);
template.notifyActivate();
}
}
}
LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!"); LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!");
} }
@@ -69,26 +69,40 @@ public class DocumentEngine
public List<Item> loadItems() public List<Item> loadItems()
{ {
final List<Item> list = new CopyOnWriteArrayList<>(); final List<Item> list = new CopyOnWriteArrayList<>();
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles) if (Config.THREADS_FOR_LOADING)
{ {
jobs.add(ThreadPool.schedule(() -> final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles)
{
jobs.add(ThreadPool.schedule(() ->
{
final DocumentItem document = new DocumentItem(file);
document.parse();
list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
}
}
else
{
for (File file : _itemFiles)
{ {
final DocumentItem document = new DocumentItem(file); final DocumentItem document = new DocumentItem(file);
document.parse(); document.parse();
list.addAll(document.getItemList()); list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
return list; return list;
} }
+4
View File
@@ -145,6 +145,10 @@ ThreadsPerInstantThreadPool = 2
# Default: 2 # Default: 2
UrgentPacketThreadCoreSize = 2 UrgentPacketThreadCoreSize = 2
# Use threads to decrease startup time.
# Default: False
ThreadsForLoading = False
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Dead Lock Detector (separate thread for detecting deadlocks) # Dead Lock Detector (separate thread for detecting deadlocks)
@@ -425,6 +425,7 @@ public final class Config
public static int INSTANT_THREAD_POOL_COUNT; public static int INSTANT_THREAD_POOL_COUNT;
public static int THREADS_PER_INSTANT_THREAD_POOL; public static int THREADS_PER_INSTANT_THREAD_POOL;
public static int IO_PACKET_THREAD_CORE_SIZE; public static int IO_PACKET_THREAD_CORE_SIZE;
public static boolean THREADS_FOR_LOADING;
public static boolean DEADLOCK_DETECTOR; public static boolean DEADLOCK_DETECTOR;
public static int DEADLOCK_CHECK_INTERVAL; public static int DEADLOCK_CHECK_INTERVAL;
public static boolean RESTART_ON_DEADLOCK; public static boolean RESTART_ON_DEADLOCK;
@@ -1287,6 +1288,7 @@ public final class Config
} }
THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2); THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2);
IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2); IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2);
THREADS_FOR_LOADING = serverSettings.getBoolean("ThreadsForLoading", false);
DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true); DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true);
DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20); DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20);
@@ -165,29 +165,47 @@ public interface IXmlReader
return false; return false;
} }
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>(); if (Config.THREADS_FOR_LOADING)
final File[] listOfFiles = dir.listFiles();
for (File f : listOfFiles)
{ {
if (recursive && f.isDirectory()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
parseDirectory(f, recursive); if (recursive && file.isDirectory())
}
else if (getCurrentFileFilter().accept(f))
{
jobs.add(ThreadPool.schedule(() ->
{ {
parseFile(f); parseDirectory(file, recursive);
}, 0)); }
else if (getCurrentFileFilter().accept(file))
{
jobs.add(ThreadPool.schedule(() ->
{
parseFile(file);
}, 0));
}
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
} }
} }
while (!jobs.isEmpty()) else
{ {
for (ScheduledFuture<?> job : jobs) final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) if (recursive && file.isDirectory())
{ {
jobs.remove(job); parseDirectory(file, recursive);
}
else if (getCurrentFileFilter().accept(file))
{
parseFile(file);
} }
} }
} }
@@ -95,28 +95,44 @@ public class SpawnsData implements IXmlReader
} }
LOGGER.info(getClass().getSimpleName() + ": Initializing spawns..."); LOGGER.info(getClass().getSimpleName() + ": Initializing spawns...");
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns) if (Config.THREADS_FOR_LOADING)
{ {
if (template.isSpawningByDefault()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns)
{ {
jobs.add(ThreadPool.schedule(() -> if (template.isSpawningByDefault())
{ {
template.spawnAll(null); jobs.add(ThreadPool.schedule(() ->
template.notifyActivate(); {
}, 0)); template.spawnAll(null);
template.notifyActivate();
}, 0));
}
} }
} while (!jobs.isEmpty())
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) for (ScheduledFuture<?> job : jobs)
{ {
jobs.remove(job); if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
} }
else
{
for (SpawnTemplate template : _spawns)
{
if (template.isSpawningByDefault())
{
template.spawnAll(null);
template.notifyActivate();
}
}
}
LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!"); LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!");
} }
@@ -69,26 +69,40 @@ public class DocumentEngine
public List<Item> loadItems() public List<Item> loadItems()
{ {
final List<Item> list = new CopyOnWriteArrayList<>(); final List<Item> list = new CopyOnWriteArrayList<>();
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles) if (Config.THREADS_FOR_LOADING)
{ {
jobs.add(ThreadPool.schedule(() -> final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles)
{
jobs.add(ThreadPool.schedule(() ->
{
final DocumentItem document = new DocumentItem(file);
document.parse();
list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
}
}
else
{
for (File file : _itemFiles)
{ {
final DocumentItem document = new DocumentItem(file); final DocumentItem document = new DocumentItem(file);
document.parse(); document.parse();
list.addAll(document.getItemList()); list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
return list; return list;
} }
+4
View File
@@ -145,6 +145,10 @@ ThreadsPerInstantThreadPool = 2
# Default: 2 # Default: 2
UrgentPacketThreadCoreSize = 2 UrgentPacketThreadCoreSize = 2
# Use threads to decrease startup time.
# Default: False
ThreadsForLoading = False
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Dead Lock Detector (separate thread for detecting deadlocks) # Dead Lock Detector (separate thread for detecting deadlocks)
@@ -426,6 +426,7 @@ public final class Config
public static int INSTANT_THREAD_POOL_COUNT; public static int INSTANT_THREAD_POOL_COUNT;
public static int THREADS_PER_INSTANT_THREAD_POOL; public static int THREADS_PER_INSTANT_THREAD_POOL;
public static int IO_PACKET_THREAD_CORE_SIZE; public static int IO_PACKET_THREAD_CORE_SIZE;
public static boolean THREADS_FOR_LOADING;
public static boolean DEADLOCK_DETECTOR; public static boolean DEADLOCK_DETECTOR;
public static int DEADLOCK_CHECK_INTERVAL; public static int DEADLOCK_CHECK_INTERVAL;
public static boolean RESTART_ON_DEADLOCK; public static boolean RESTART_ON_DEADLOCK;
@@ -1294,6 +1295,7 @@ public final class Config
} }
THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2); THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2);
IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2); IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2);
THREADS_FOR_LOADING = serverSettings.getBoolean("ThreadsForLoading", false);
DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true); DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true);
DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20); DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20);
@@ -165,29 +165,47 @@ public interface IXmlReader
return false; return false;
} }
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>(); if (Config.THREADS_FOR_LOADING)
final File[] listOfFiles = dir.listFiles();
for (File f : listOfFiles)
{ {
if (recursive && f.isDirectory()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
parseDirectory(f, recursive); if (recursive && file.isDirectory())
}
else if (getCurrentFileFilter().accept(f))
{
jobs.add(ThreadPool.schedule(() ->
{ {
parseFile(f); parseDirectory(file, recursive);
}, 0)); }
else if (getCurrentFileFilter().accept(file))
{
jobs.add(ThreadPool.schedule(() ->
{
parseFile(file);
}, 0));
}
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
} }
} }
while (!jobs.isEmpty()) else
{ {
for (ScheduledFuture<?> job : jobs) final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) if (recursive && file.isDirectory())
{ {
jobs.remove(job); parseDirectory(file, recursive);
}
else if (getCurrentFileFilter().accept(file))
{
parseFile(file);
} }
} }
} }
@@ -95,28 +95,44 @@ public class SpawnsData implements IXmlReader
} }
LOGGER.info(getClass().getSimpleName() + ": Initializing spawns..."); LOGGER.info(getClass().getSimpleName() + ": Initializing spawns...");
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns) if (Config.THREADS_FOR_LOADING)
{ {
if (template.isSpawningByDefault()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns)
{ {
jobs.add(ThreadPool.schedule(() -> if (template.isSpawningByDefault())
{ {
template.spawnAll(null); jobs.add(ThreadPool.schedule(() ->
template.notifyActivate(); {
}, 0)); template.spawnAll(null);
template.notifyActivate();
}, 0));
}
} }
} while (!jobs.isEmpty())
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) for (ScheduledFuture<?> job : jobs)
{ {
jobs.remove(job); if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
} }
else
{
for (SpawnTemplate template : _spawns)
{
if (template.isSpawningByDefault())
{
template.spawnAll(null);
template.notifyActivate();
}
}
}
LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!"); LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!");
} }
@@ -69,26 +69,40 @@ public class DocumentEngine
public List<Item> loadItems() public List<Item> loadItems()
{ {
final List<Item> list = new CopyOnWriteArrayList<>(); final List<Item> list = new CopyOnWriteArrayList<>();
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles) if (Config.THREADS_FOR_LOADING)
{ {
jobs.add(ThreadPool.schedule(() -> final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles)
{
jobs.add(ThreadPool.schedule(() ->
{
final DocumentItem document = new DocumentItem(file);
document.parse();
list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
}
}
else
{
for (File file : _itemFiles)
{ {
final DocumentItem document = new DocumentItem(file); final DocumentItem document = new DocumentItem(file);
document.parse(); document.parse();
list.addAll(document.getItemList()); list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
return list; return list;
} }
@@ -145,6 +145,10 @@ ThreadsPerInstantThreadPool = 2
# Default: 2 # Default: 2
UrgentPacketThreadCoreSize = 2 UrgentPacketThreadCoreSize = 2
# Use threads to decrease startup time.
# Default: False
ThreadsForLoading = False
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Dead Lock Detector (separate thread for detecting deadlocks) # Dead Lock Detector (separate thread for detecting deadlocks)
@@ -503,6 +503,7 @@ public final class Config
public static int INSTANT_THREAD_POOL_COUNT; public static int INSTANT_THREAD_POOL_COUNT;
public static int THREADS_PER_INSTANT_THREAD_POOL; public static int THREADS_PER_INSTANT_THREAD_POOL;
public static int IO_PACKET_THREAD_CORE_SIZE; public static int IO_PACKET_THREAD_CORE_SIZE;
public static boolean THREADS_FOR_LOADING;
public static boolean DEADLOCK_DETECTOR; public static boolean DEADLOCK_DETECTOR;
public static int DEADLOCK_CHECK_INTERVAL; public static int DEADLOCK_CHECK_INTERVAL;
public static boolean RESTART_ON_DEADLOCK; public static boolean RESTART_ON_DEADLOCK;
@@ -1453,6 +1454,7 @@ public final class Config
} }
THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2); THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2);
IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2); IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2);
THREADS_FOR_LOADING = serverSettings.getBoolean("ThreadsForLoading", false);
DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true); DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true);
DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20); DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20);
@@ -165,29 +165,47 @@ public interface IXmlReader
return false; return false;
} }
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>(); if (Config.THREADS_FOR_LOADING)
final File[] listOfFiles = dir.listFiles();
for (File f : listOfFiles)
{ {
if (recursive && f.isDirectory()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
parseDirectory(f, recursive); if (recursive && file.isDirectory())
}
else if (getCurrentFileFilter().accept(f))
{
jobs.add(ThreadPool.schedule(() ->
{ {
parseFile(f); parseDirectory(file, recursive);
}, 0)); }
else if (getCurrentFileFilter().accept(file))
{
jobs.add(ThreadPool.schedule(() ->
{
parseFile(file);
}, 0));
}
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
} }
} }
while (!jobs.isEmpty()) else
{ {
for (ScheduledFuture<?> job : jobs) final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) if (recursive && file.isDirectory())
{ {
jobs.remove(job); parseDirectory(file, recursive);
}
else if (getCurrentFileFilter().accept(file))
{
parseFile(file);
} }
} }
} }
@@ -87,10 +87,39 @@ public class DocumentEngine
public void loadAllSkills(Map<Integer, Skill> allSkills) public void loadAllSkills(Map<Integer, Skill> allSkills)
{ {
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>(); if (Config.THREADS_FOR_LOADING)
for (File file : _skillFiles)
{ {
jobs.add(ThreadPool.schedule(() -> final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _skillFiles)
{
jobs.add(ThreadPool.schedule(() ->
{
final List<Skill> skills = loadSkills(file);
if (skills == null)
{
return;
}
for (Skill skill : skills)
{
allSkills.put(SkillData.getSkillHashCode(skill), skill);
count++;
}
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
}
}
else
{
for (File file : _skillFiles)
{ {
final List<Skill> skills = loadSkills(file); final List<Skill> skills = loadSkills(file);
if (skills == null) if (skills == null)
@@ -102,18 +131,9 @@ public class DocumentEngine
allSkills.put(SkillData.getSkillHashCode(skill), skill); allSkills.put(SkillData.getSkillHashCode(skill), skill);
count++; count++;
} }
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
LOGGER.info(getClass().getSimpleName() + ": Loaded " + count + " Skill templates from XML files."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + count + " Skill templates from XML files.");
} }
@@ -123,27 +143,41 @@ public class DocumentEngine
*/ */
public List<Item> loadItems() public List<Item> loadItems()
{ {
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
final List<Item> list = new CopyOnWriteArrayList<>(); final List<Item> list = new CopyOnWriteArrayList<>();
for (File file : _itemFiles)
if (Config.THREADS_FOR_LOADING)
{ {
jobs.add(ThreadPool.schedule(() -> final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles)
{
jobs.add(ThreadPool.schedule(() ->
{
final DocumentItem document = new DocumentItem(file);
document.parse();
list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
}
}
else
{
for (File file : _itemFiles)
{ {
final DocumentItem document = new DocumentItem(file); final DocumentItem document = new DocumentItem(file);
document.parse(); document.parse();
list.addAll(document.getItemList()); list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
return list; return list;
} }
@@ -145,6 +145,10 @@ ThreadsPerInstantThreadPool = 2
# Default: 2 # Default: 2
UrgentPacketThreadCoreSize = 2 UrgentPacketThreadCoreSize = 2
# Use threads to decrease startup time.
# Default: False
ThreadsForLoading = False
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Dead Lock Detector (separate thread for detecting deadlocks) # Dead Lock Detector (separate thread for detecting deadlocks)
@@ -436,6 +436,7 @@ public final class Config
public static int INSTANT_THREAD_POOL_COUNT; public static int INSTANT_THREAD_POOL_COUNT;
public static int THREADS_PER_INSTANT_THREAD_POOL; public static int THREADS_PER_INSTANT_THREAD_POOL;
public static int IO_PACKET_THREAD_CORE_SIZE; public static int IO_PACKET_THREAD_CORE_SIZE;
public static boolean THREADS_FOR_LOADING;
public static boolean DEADLOCK_DETECTOR; public static boolean DEADLOCK_DETECTOR;
public static int DEADLOCK_CHECK_INTERVAL; public static int DEADLOCK_CHECK_INTERVAL;
public static boolean RESTART_ON_DEADLOCK; public static boolean RESTART_ON_DEADLOCK;
@@ -1231,6 +1232,7 @@ public final class Config
} }
THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2); THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2);
IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2); IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2);
THREADS_FOR_LOADING = serverSettings.getBoolean("ThreadsForLoading", false);
DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true); DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true);
DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20); DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20);
@@ -165,29 +165,47 @@ public interface IXmlReader
return false; return false;
} }
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>(); if (Config.THREADS_FOR_LOADING)
final File[] listOfFiles = dir.listFiles();
for (File f : listOfFiles)
{ {
if (recursive && f.isDirectory()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
parseDirectory(f, recursive); if (recursive && file.isDirectory())
}
else if (getCurrentFileFilter().accept(f))
{
jobs.add(ThreadPool.schedule(() ->
{ {
parseFile(f); parseDirectory(file, recursive);
}, 0)); }
else if (getCurrentFileFilter().accept(file))
{
jobs.add(ThreadPool.schedule(() ->
{
parseFile(file);
}, 0));
}
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
} }
} }
while (!jobs.isEmpty()) else
{ {
for (ScheduledFuture<?> job : jobs) final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) if (recursive && file.isDirectory())
{ {
jobs.remove(job); parseDirectory(file, recursive);
}
else if (getCurrentFileFilter().accept(file))
{
parseFile(file);
} }
} }
} }
@@ -95,28 +95,44 @@ public class SpawnsData implements IXmlReader
} }
LOGGER.info(getClass().getSimpleName() + ": Initializing spawns..."); LOGGER.info(getClass().getSimpleName() + ": Initializing spawns...");
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns) if (Config.THREADS_FOR_LOADING)
{ {
if (template.isSpawningByDefault()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns)
{ {
jobs.add(ThreadPool.schedule(() -> if (template.isSpawningByDefault())
{ {
template.spawnAll(null); jobs.add(ThreadPool.schedule(() ->
template.notifyActivate(); {
}, 0)); template.spawnAll(null);
template.notifyActivate();
}, 0));
}
} }
} while (!jobs.isEmpty())
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) for (ScheduledFuture<?> job : jobs)
{ {
jobs.remove(job); if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
} }
else
{
for (SpawnTemplate template : _spawns)
{
if (template.isSpawningByDefault())
{
template.spawnAll(null);
template.notifyActivate();
}
}
}
LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!"); LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!");
} }
@@ -69,26 +69,40 @@ public class DocumentEngine
public List<Item> loadItems() public List<Item> loadItems()
{ {
final List<Item> list = new CopyOnWriteArrayList<>(); final List<Item> list = new CopyOnWriteArrayList<>();
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles) if (Config.THREADS_FOR_LOADING)
{ {
jobs.add(ThreadPool.schedule(() -> final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles)
{
jobs.add(ThreadPool.schedule(() ->
{
final DocumentItem document = new DocumentItem(file);
document.parse();
list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
}
}
else
{
for (File file : _itemFiles)
{ {
final DocumentItem document = new DocumentItem(file); final DocumentItem document = new DocumentItem(file);
document.parse(); document.parse();
list.addAll(document.getItemList()); list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
return list; return list;
} }
@@ -145,6 +145,10 @@ ThreadsPerInstantThreadPool = 2
# Default: 2 # Default: 2
UrgentPacketThreadCoreSize = 2 UrgentPacketThreadCoreSize = 2
# Use threads to decrease startup time.
# Default: False
ThreadsForLoading = False
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Dead Lock Detector (separate thread for detecting deadlocks) # Dead Lock Detector (separate thread for detecting deadlocks)
@@ -436,6 +436,7 @@ public final class Config
public static int INSTANT_THREAD_POOL_COUNT; public static int INSTANT_THREAD_POOL_COUNT;
public static int THREADS_PER_INSTANT_THREAD_POOL; public static int THREADS_PER_INSTANT_THREAD_POOL;
public static int IO_PACKET_THREAD_CORE_SIZE; public static int IO_PACKET_THREAD_CORE_SIZE;
public static boolean THREADS_FOR_LOADING;
public static boolean DEADLOCK_DETECTOR; public static boolean DEADLOCK_DETECTOR;
public static int DEADLOCK_CHECK_INTERVAL; public static int DEADLOCK_CHECK_INTERVAL;
public static boolean RESTART_ON_DEADLOCK; public static boolean RESTART_ON_DEADLOCK;
@@ -1235,6 +1236,7 @@ public final class Config
} }
THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2); THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2);
IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2); IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2);
THREADS_FOR_LOADING = serverSettings.getBoolean("ThreadsForLoading", false);
DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true); DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true);
DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20); DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20);
@@ -165,29 +165,47 @@ public interface IXmlReader
return false; return false;
} }
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>(); if (Config.THREADS_FOR_LOADING)
final File[] listOfFiles = dir.listFiles();
for (File f : listOfFiles)
{ {
if (recursive && f.isDirectory()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
parseDirectory(f, recursive); if (recursive && file.isDirectory())
}
else if (getCurrentFileFilter().accept(f))
{
jobs.add(ThreadPool.schedule(() ->
{ {
parseFile(f); parseDirectory(file, recursive);
}, 0)); }
else if (getCurrentFileFilter().accept(file))
{
jobs.add(ThreadPool.schedule(() ->
{
parseFile(file);
}, 0));
}
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
} }
} }
while (!jobs.isEmpty()) else
{ {
for (ScheduledFuture<?> job : jobs) final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) if (recursive && file.isDirectory())
{ {
jobs.remove(job); parseDirectory(file, recursive);
}
else if (getCurrentFileFilter().accept(file))
{
parseFile(file);
} }
} }
} }
@@ -95,28 +95,44 @@ public class SpawnsData implements IXmlReader
} }
LOGGER.info(getClass().getSimpleName() + ": Initializing spawns..."); LOGGER.info(getClass().getSimpleName() + ": Initializing spawns...");
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns) if (Config.THREADS_FOR_LOADING)
{ {
if (template.isSpawningByDefault()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns)
{ {
jobs.add(ThreadPool.schedule(() -> if (template.isSpawningByDefault())
{ {
template.spawnAll(null); jobs.add(ThreadPool.schedule(() ->
template.notifyActivate(); {
}, 0)); template.spawnAll(null);
template.notifyActivate();
}, 0));
}
} }
} while (!jobs.isEmpty())
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) for (ScheduledFuture<?> job : jobs)
{ {
jobs.remove(job); if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
} }
else
{
for (SpawnTemplate template : _spawns)
{
if (template.isSpawningByDefault())
{
template.spawnAll(null);
template.notifyActivate();
}
}
}
LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!"); LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!");
} }
@@ -69,26 +69,40 @@ public class DocumentEngine
public List<Item> loadItems() public List<Item> loadItems()
{ {
final List<Item> list = new CopyOnWriteArrayList<>(); final List<Item> list = new CopyOnWriteArrayList<>();
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles) if (Config.THREADS_FOR_LOADING)
{ {
jobs.add(ThreadPool.schedule(() -> final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles)
{
jobs.add(ThreadPool.schedule(() ->
{
final DocumentItem document = new DocumentItem(file);
document.parse();
list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
}
}
else
{
for (File file : _itemFiles)
{ {
final DocumentItem document = new DocumentItem(file); final DocumentItem document = new DocumentItem(file);
document.parse(); document.parse();
list.addAll(document.getItemList()); list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
return list; return list;
} }
@@ -145,6 +145,10 @@ ThreadsPerInstantThreadPool = 2
# Default: 2 # Default: 2
UrgentPacketThreadCoreSize = 2 UrgentPacketThreadCoreSize = 2
# Use threads to decrease startup time.
# Default: False
ThreadsForLoading = False
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Dead Lock Detector (separate thread for detecting deadlocks) # Dead Lock Detector (separate thread for detecting deadlocks)
@@ -436,6 +436,7 @@ public final class Config
public static int INSTANT_THREAD_POOL_COUNT; public static int INSTANT_THREAD_POOL_COUNT;
public static int THREADS_PER_INSTANT_THREAD_POOL; public static int THREADS_PER_INSTANT_THREAD_POOL;
public static int IO_PACKET_THREAD_CORE_SIZE; public static int IO_PACKET_THREAD_CORE_SIZE;
public static boolean THREADS_FOR_LOADING;
public static boolean DEADLOCK_DETECTOR; public static boolean DEADLOCK_DETECTOR;
public static int DEADLOCK_CHECK_INTERVAL; public static int DEADLOCK_CHECK_INTERVAL;
public static boolean RESTART_ON_DEADLOCK; public static boolean RESTART_ON_DEADLOCK;
@@ -1235,6 +1236,7 @@ public final class Config
} }
THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2); THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2);
IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2); IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2);
THREADS_FOR_LOADING = serverSettings.getBoolean("ThreadsForLoading", false);
DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true); DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true);
DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20); DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20);
@@ -165,29 +165,47 @@ public interface IXmlReader
return false; return false;
} }
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>(); if (Config.THREADS_FOR_LOADING)
final File[] listOfFiles = dir.listFiles();
for (File f : listOfFiles)
{ {
if (recursive && f.isDirectory()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
parseDirectory(f, recursive); if (recursive && file.isDirectory())
}
else if (getCurrentFileFilter().accept(f))
{
jobs.add(ThreadPool.schedule(() ->
{ {
parseFile(f); parseDirectory(file, recursive);
}, 0)); }
else if (getCurrentFileFilter().accept(file))
{
jobs.add(ThreadPool.schedule(() ->
{
parseFile(file);
}, 0));
}
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
} }
} }
while (!jobs.isEmpty()) else
{ {
for (ScheduledFuture<?> job : jobs) final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) if (recursive && file.isDirectory())
{ {
jobs.remove(job); parseDirectory(file, recursive);
}
else if (getCurrentFileFilter().accept(file))
{
parseFile(file);
} }
} }
} }
@@ -95,28 +95,44 @@ public class SpawnsData implements IXmlReader
} }
LOGGER.info(getClass().getSimpleName() + ": Initializing spawns..."); LOGGER.info(getClass().getSimpleName() + ": Initializing spawns...");
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns) if (Config.THREADS_FOR_LOADING)
{ {
if (template.isSpawningByDefault()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns)
{ {
jobs.add(ThreadPool.schedule(() -> if (template.isSpawningByDefault())
{ {
template.spawnAll(null); jobs.add(ThreadPool.schedule(() ->
template.notifyActivate(); {
}, 0)); template.spawnAll(null);
template.notifyActivate();
}, 0));
}
} }
} while (!jobs.isEmpty())
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) for (ScheduledFuture<?> job : jobs)
{ {
jobs.remove(job); if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
} }
else
{
for (SpawnTemplate template : _spawns)
{
if (template.isSpawningByDefault())
{
template.spawnAll(null);
template.notifyActivate();
}
}
}
LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!"); LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!");
} }
@@ -69,26 +69,40 @@ public class DocumentEngine
public List<Item> loadItems() public List<Item> loadItems()
{ {
final List<Item> list = new CopyOnWriteArrayList<>(); final List<Item> list = new CopyOnWriteArrayList<>();
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles) if (Config.THREADS_FOR_LOADING)
{ {
jobs.add(ThreadPool.schedule(() -> final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles)
{
jobs.add(ThreadPool.schedule(() ->
{
final DocumentItem document = new DocumentItem(file);
document.parse();
list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
}
}
else
{
for (File file : _itemFiles)
{ {
final DocumentItem document = new DocumentItem(file); final DocumentItem document = new DocumentItem(file);
document.parse(); document.parse();
list.addAll(document.getItemList()); list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
return list; return list;
} }
@@ -145,6 +145,10 @@ ThreadsPerInstantThreadPool = 2
# Default: 2 # Default: 2
UrgentPacketThreadCoreSize = 2 UrgentPacketThreadCoreSize = 2
# Use threads to decrease startup time.
# Default: False
ThreadsForLoading = False
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Dead Lock Detector (separate thread for detecting deadlocks) # Dead Lock Detector (separate thread for detecting deadlocks)
@@ -436,6 +436,7 @@ public final class Config
public static int INSTANT_THREAD_POOL_COUNT; public static int INSTANT_THREAD_POOL_COUNT;
public static int THREADS_PER_INSTANT_THREAD_POOL; public static int THREADS_PER_INSTANT_THREAD_POOL;
public static int IO_PACKET_THREAD_CORE_SIZE; public static int IO_PACKET_THREAD_CORE_SIZE;
public static boolean THREADS_FOR_LOADING;
public static boolean DEADLOCK_DETECTOR; public static boolean DEADLOCK_DETECTOR;
public static int DEADLOCK_CHECK_INTERVAL; public static int DEADLOCK_CHECK_INTERVAL;
public static boolean RESTART_ON_DEADLOCK; public static boolean RESTART_ON_DEADLOCK;
@@ -1235,6 +1236,7 @@ public final class Config
} }
THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2); THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 2);
IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2); IO_PACKET_THREAD_CORE_SIZE = serverSettings.getInt("UrgentPacketThreadCoreSize", 2);
THREADS_FOR_LOADING = serverSettings.getBoolean("ThreadsForLoading", false);
DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true); DEADLOCK_DETECTOR = serverSettings.getBoolean("DeadLockDetector", true);
DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20); DEADLOCK_CHECK_INTERVAL = serverSettings.getInt("DeadLockCheckInterval", 20);
@@ -165,29 +165,47 @@ public interface IXmlReader
return false; return false;
} }
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>(); if (Config.THREADS_FOR_LOADING)
final File[] listOfFiles = dir.listFiles();
for (File f : listOfFiles)
{ {
if (recursive && f.isDirectory()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
parseDirectory(f, recursive); if (recursive && file.isDirectory())
}
else if (getCurrentFileFilter().accept(f))
{
jobs.add(ThreadPool.schedule(() ->
{ {
parseFile(f); parseDirectory(file, recursive);
}, 0)); }
else if (getCurrentFileFilter().accept(file))
{
jobs.add(ThreadPool.schedule(() ->
{
parseFile(file);
}, 0));
}
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
} }
} }
while (!jobs.isEmpty()) else
{ {
for (ScheduledFuture<?> job : jobs) final File[] listOfFiles = dir.listFiles();
for (File file : listOfFiles)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) if (recursive && file.isDirectory())
{ {
jobs.remove(job); parseDirectory(file, recursive);
}
else if (getCurrentFileFilter().accept(file))
{
parseFile(file);
} }
} }
} }
@@ -95,28 +95,44 @@ public class SpawnsData implements IXmlReader
} }
LOGGER.info(getClass().getSimpleName() + ": Initializing spawns..."); LOGGER.info(getClass().getSimpleName() + ": Initializing spawns...");
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns) if (Config.THREADS_FOR_LOADING)
{ {
if (template.isSpawningByDefault()) final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (SpawnTemplate template : _spawns)
{ {
jobs.add(ThreadPool.schedule(() -> if (template.isSpawningByDefault())
{ {
template.spawnAll(null); jobs.add(ThreadPool.schedule(() ->
template.notifyActivate(); {
}, 0)); template.spawnAll(null);
template.notifyActivate();
}, 0));
}
} }
} while (!jobs.isEmpty())
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{ {
if ((job == null) || job.isDone() || job.isCancelled()) for (ScheduledFuture<?> job : jobs)
{ {
jobs.remove(job); if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
} }
else
{
for (SpawnTemplate template : _spawns)
{
if (template.isSpawningByDefault())
{
template.spawnAll(null);
template.notifyActivate();
}
}
}
LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!"); LOGGER.info(getClass().getSimpleName() + ": All spawns has been initialized!");
} }
@@ -69,26 +69,40 @@ public class DocumentEngine
public List<Item> loadItems() public List<Item> loadItems()
{ {
final List<Item> list = new CopyOnWriteArrayList<>(); final List<Item> list = new CopyOnWriteArrayList<>();
final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles) if (Config.THREADS_FOR_LOADING)
{ {
jobs.add(ThreadPool.schedule(() -> final List<ScheduledFuture<?>> jobs = new CopyOnWriteArrayList<>();
for (File file : _itemFiles)
{
jobs.add(ThreadPool.schedule(() ->
{
final DocumentItem document = new DocumentItem(file);
document.parse();
list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
}
}
}
else
{
for (File file : _itemFiles)
{ {
final DocumentItem document = new DocumentItem(file); final DocumentItem document = new DocumentItem(file);
document.parse(); document.parse();
list.addAll(document.getItemList()); list.addAll(document.getItemList());
}, 0));
}
while (!jobs.isEmpty())
{
for (ScheduledFuture<?> job : jobs)
{
if ((job == null) || job.isDone() || job.isCancelled())
{
jobs.remove(job);
}
} }
} }
return list; return list;
} }