From 74e6acc38820c076344406d944bb005670497d6e Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Sat, 22 Oct 2022 00:16:16 +0000 Subject: [PATCH] Addition of AttackableThink and Movement task pools. --- .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ .../org/l2jmobius/gameserver/Shutdown.java | 11 --- .../AttackableThinkTaskManager.java | 81 ++++++++++++------- .../taskmanager/MovementTaskManager.java | 61 ++++++++------ 93 files changed, 2790 insertions(+), 1953 deletions(-) diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/Shutdown.java index 4e636cbf2f..2637cd3572 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/Shutdown.java @@ -48,7 +48,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -146,16 +145,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/Shutdown.java index 4e636cbf2f..2637cd3572 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/Shutdown.java @@ -48,7 +48,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -146,16 +145,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/Shutdown.java index 4e636cbf2f..2637cd3572 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/Shutdown.java @@ -48,7 +48,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -146,16 +145,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/Shutdown.java index 4e636cbf2f..2637cd3572 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/Shutdown.java @@ -48,7 +48,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -146,16 +145,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/Shutdown.java index 5b5c8cf1db..bf82d4e7f4 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/Shutdown.java @@ -48,7 +48,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -146,16 +145,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/Shutdown.java index 4e636cbf2f..2637cd3572 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/Shutdown.java @@ -48,7 +48,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -146,16 +145,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/Shutdown.java index 4e636cbf2f..2637cd3572 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/Shutdown.java @@ -48,7 +48,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -146,16 +145,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/Shutdown.java index 4e636cbf2f..2637cd3572 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/Shutdown.java @@ -48,7 +48,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -146,16 +145,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/Shutdown.java index 4e636cbf2f..2637cd3572 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/Shutdown.java @@ -48,7 +48,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -146,16 +145,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/Shutdown.java index 4e636cbf2f..2637cd3572 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/Shutdown.java @@ -48,7 +48,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -146,16 +145,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/Shutdown.java index e5a43f184c..90ba48b0fc 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/Shutdown.java @@ -48,7 +48,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -146,16 +145,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/Shutdown.java index e5a43f184c..90ba48b0fc 100644 --- a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/Shutdown.java @@ -48,7 +48,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -146,16 +145,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/Shutdown.java index 164de65ece..3790882ea2 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/Shutdown.java @@ -47,7 +47,6 @@ import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld; import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -296,16 +295,6 @@ public class Shutdown extends Thread // saveData sends messages to exit players, so shutdown selector after it saveData(); - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager thread has been shutdown."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/Shutdown.java index d02cd28488..db78bd13a3 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/Shutdown.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld; import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -298,16 +297,6 @@ public class Shutdown extends Thread // saveData sends messages to exit players, so shutdown selector after it saveData(); - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager thread has been shutdown."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/Shutdown.java index 266b3acc60..f0e0720ede 100644 --- a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/Shutdown.java @@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -149,16 +148,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/Shutdown.java index 1f60f2e481..fad4255af7 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/Shutdown.java @@ -53,7 +53,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -151,16 +150,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/Shutdown.java index 1f60f2e481..fad4255af7 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/Shutdown.java @@ -53,7 +53,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -151,16 +150,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/Shutdown.java index 8da5b7bc14..6d74e80bd4 100644 --- a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/Shutdown.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -147,16 +146,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/Shutdown.java index 8da5b7bc14..6d74e80bd4 100644 --- a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/Shutdown.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -147,16 +146,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/Shutdown.java index 8da5b7bc14..6d74e80bd4 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/Shutdown.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -147,16 +146,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/Shutdown.java index 8da5b7bc14..6d74e80bd4 100644 --- a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/Shutdown.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -147,16 +146,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/Shutdown.java index 8da5b7bc14..6d74e80bd4 100644 --- a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/Shutdown.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -147,16 +146,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/Shutdown.java index 8da5b7bc14..6d74e80bd4 100644 --- a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/Shutdown.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -147,16 +146,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/gameserver/Shutdown.java index 8da5b7bc14..6d74e80bd4 100644 --- a/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/gameserver/Shutdown.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -147,16 +146,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/Shutdown.java index 8da5b7bc14..6d74e80bd4 100644 --- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/Shutdown.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -147,16 +146,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/Shutdown.java index 8da5b7bc14..6d74e80bd4 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/Shutdown.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -147,16 +146,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/Shutdown.java index 8da5b7bc14..6d74e80bd4 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/Shutdown.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -147,16 +146,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/Shutdown.java index 8da5b7bc14..6d74e80bd4 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/Shutdown.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -147,16 +146,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/Shutdown.java index cc4be61e6a..fd343dcbe2 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/Shutdown.java @@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -158,16 +157,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/Shutdown.java index 22f8e4af27..bf00c77a88 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/Shutdown.java @@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -158,16 +157,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance() diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/Shutdown.java index 22f8e4af27..bf00c77a88 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/Shutdown.java @@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ServerClose; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.telnet.TelnetServer; import org.l2jmobius.gameserver.taskmanager.GameTimeTaskManager; -import org.l2jmobius.gameserver.taskmanager.MovementTaskManager; import org.l2jmobius.gameserver.util.Broadcast; /** @@ -158,16 +157,6 @@ public class Shutdown extends Thread // ensure all services are stopped - try - { - MovementTaskManager.getInstance().interrupt(); - LOGGER.info("Movement Task Manager: Thread interruped(" + tc.getEstimatedTimeAndRestartCounter() + "ms)."); - } - catch (Throwable t) - { - // ignore - } - try { GameTimeTaskManager.getInstance().interrupt(); diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java index f2588edc5f..81da79393b 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/taskmanager/AttackableThinkTaskManager.java @@ -26,60 +26,85 @@ import org.l2jmobius.gameserver.model.actor.Attackable; /** * @author Mobius */ -public class AttackableThinkTaskManager implements Runnable +public class AttackableThinkTaskManager { - private static final Set ATTACKABLES = ConcurrentHashMap.newKeySet(); - private static boolean _working = false; + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 1000; protected AttackableThinkTaskManager() { - ThreadPool.scheduleAtFixedRate(this, 1000, 1000); } - @Override - public void run() + private class AttackableThink implements Runnable { - if (_working) - { - return; - } - _working = true; + private final Set _attackables; - CreatureAI ai; - for (Attackable attackable : ATTACKABLES) + public AttackableThink(Set attackables) { - if (attackable.hasAI()) + _attackables = attackables; + } + + @Override + public void run() + { + CreatureAI ai; + for (Attackable attackable : _attackables) { - ai = attackable.getAI(); - if (ai != null) + if (attackable.hasAI()) { - ai.onEvtThink(); + ai = attackable.getAI(); + if (ai != null) + { + ai.onEvtThink(); + } + else + { + _attackables.remove(attackable); + } } else { - remove(attackable); + _attackables.remove(attackable); } } - else + } + } + + public synchronized void add(Attackable attackable) + { + for (Set pool : POOLS) + { + if (pool.contains(attackable)) { - remove(attackable); + return; } } - _working = false; - } - - public void add(Attackable attackable) - { - if (!ATTACKABLES.contains(attackable)) + for (Set pool : POOLS) { - ATTACKABLES.add(attackable); + if (pool.size() < POOL_SIZE) + { + pool.add(attackable); + return; + } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(attackable); + ThreadPool.scheduleAtFixedRate(new AttackableThink(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public void remove(Attackable attackable) { - ATTACKABLES.remove(attackable); + for (Set pool : POOLS) + { + if (pool.remove(attackable)) + { + return; + } + } } public static AttackableThinkTaskManager getInstance() diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java index 5e451b1f75..8d9850ff08 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/taskmanager/MovementTaskManager.java @@ -19,53 +19,66 @@ package org.l2jmobius.gameserver.taskmanager; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.model.actor.Creature; /** * Movement task manager class. - * @author Forsaiken, Mobius + * @author Mobius */ -public class MovementTaskManager extends Thread +public class MovementTaskManager { - private static final Set MOVING_OBJECTS = ConcurrentHashMap.newKeySet(); + private static final Set> POOLS = ConcurrentHashMap.newKeySet(); + private static final int POOL_SIZE = 1000; + private static final int TASK_DELAY = 100; protected MovementTaskManager() { - super("MovementTaskManager"); - super.setDaemon(true); - super.setPriority(MAX_PRIORITY); - super.start(); + } + + private class Movement implements Runnable + { + private final Set _creatures; + + public Movement(Set creatures) + { + _creatures = creatures; + } + + @Override + public void run() + { + _creatures.removeIf(Creature::updatePosition); + } } /** * Add a Creature to moving objects of MovementTaskManager. * @param creature The Creature to add to moving objects of MovementTaskManager. */ - public void registerMovingObject(Creature creature) + public synchronized void registerMovingObject(Creature creature) { - if (creature == null) + for (Set pool : POOLS) { - return; + if (pool.contains(creature)) + { + return; + } } - MOVING_OBJECTS.add(creature); - } - - @Override - public void run() - { - while (true) + for (Set pool : POOLS) { - try + if (pool.size() < POOL_SIZE) { - MOVING_OBJECTS.removeIf(Creature::updatePosition); - Thread.sleep(100); - } - catch (InterruptedException e) - { - // Ignore. + pool.add(creature); + return; } } + + final Set pool = ConcurrentHashMap.newKeySet(POOL_SIZE); + pool.add(creature); + ThreadPool.scheduleAtFixedRate(new Movement(pool), TASK_DELAY, TASK_DELAY); + POOLS.add(pool); } public static final MovementTaskManager getInstance()