Код:
public class ThreadPoolManager
{
private static class SingletonHolder
{
protected static final ThreadPoolManager _instance = new ThreadPoolManager();
private SingletonHolder()
{
}
}
private class PurgeTask
implements Runnable
{
public void run()
{
_effectsScheduledThreadPool.purge();
_generalScheduledThreadPool.purge();
_aiScheduledThreadPool.purge();
}
final ThreadPoolManager this$0;
private PurgeTask()
{
this$0 = ThreadPoolManager.this;
super();
}
}
private static class PriorityThreadFactory
implements ThreadFactory
{
public Thread newThread(Runnable r)
{
Thread t = new Thread(_group, r);
t.setName((new StringBuilder()).append(_name).append("-").append(_threadNumber.getAndIncrement()).toString());
t.setPriority(_prio);
return t;
}
public ThreadGroup getGroup()
{
return _group;
}
private int _prio;
private String _name;
private AtomicInteger _threadNumber;
private ThreadGroup _group;
public PriorityThreadFactory(String name, int prio)
{
_threadNumber = new AtomicInteger(1);
_prio = prio;
_name = name;
_group = new ThreadGroup(_name);
}
}
private static final class RunnableWrapper
implements Runnable
{
public final void run()
{
try
{
_r.run();
}
catch(Throwable e)
{
Thread t = Thread.currentThread();
Thread.UncaughtExceptionHandler h = t.getUncaughtExceptionHandler();
if(h != null)
h.uncaughtException(t, e);
}
}
private final Runnable _r;
public RunnableWrapper(Runnable r)
{
_r = r;
}
}
public static ThreadPoolManager getInstance()
{
return SingletonHolder._instance;
}
private ThreadPoolManager()
{
_effectsScheduledThreadPool = new ScheduledThreadPoolExecutor(Config.THREAD_P_EFFECTS, new PriorityThreadFactory("EffectsSTPool", 5));
_generalScheduledThreadPool = new ScheduledThreadPoolExecutor(Config.THREAD_P_GENERAL, new PriorityThreadFactory("GeneralSTPool", 5));
_ioPacketsThreadPool = new ThreadPoolExecutor(Config.IO_PACKET_THREAD_CORE_SIZE, 0x7fffffff, 5L, TimeUnit.SECONDS, new LinkedBlockingQueue(), new PriorityThreadFactory("I/O Packet Pool", 6));
_generalPacketsThreadPool = new ThreadPoolExecutor(Config.GENERAL_PACKET_THREAD_CORE_SIZE, Config.GENERAL_PACKET_THREAD_CORE_SIZE + 2, 15L, TimeUnit.SECONDS, new LinkedBlockingQueue(), new PriorityThreadFactory("Normal Packet Pool", 6));
_generalThreadPool = new ThreadPoolExecutor(Config.GENERAL_THREAD_CORE_SIZE, Config.GENERAL_THREAD_CORE_SIZE + 2, 5L, TimeUnit.SECONDS, new LinkedBlockingQueue(), new PriorityThreadFactory("General Pool", 5));
_aiScheduledThreadPool = new ScheduledThreadPoolExecutor(Config.AI_MAX_THREAD, new PriorityThreadFactory("AISTPool", 5));
scheduleGeneralAtFixedRate(new PurgeTask(), 0x927c0L, 0x493e0L);
}
public static long validateDelay(long delay)
{
if(delay < 0L)
delay = 0L;
else
if(delay > 0x431bde82d7bL)
delay = 0x431bde82d7bL;
return delay;
}
public ScheduledFuture scheduleEffect(Runnable r, long delay)
{
try
{
delay = validateDelay(delay);
return _effectsScheduledThreadPool.schedule(new RunnableWrapper(r), delay, TimeUnit.MILLISECONDS);
}
catch(RejectedExecutionException e)
{
return null;
}
}
public ScheduledFuture scheduleEffectAtFixedRate(Runnable r, long initial, long delay)
{
try
{
delay = validateDelay(delay);
initial = validateDelay(initial);
return _effectsScheduledThreadPool.scheduleAtFixedRate(new RunnableWrapper(r), initial, delay, TimeUnit.MILLISECONDS);
}
catch(RejectedExecutionException e)
{
return null;
}
}
/**
* @deprecated Method removeEffect is deprecated
*/
@Deprecated
public boolean removeEffect(RunnableScheduledFuture r)
{
return _effectsScheduledThreadPool.remove(r);
}
public ScheduledFuture scheduleGeneral(Runnable r, long delay)
{
try
{
delay = validateDelay(delay);
return _generalScheduledThreadPool.schedule(new RunnableWrapper(r), delay, TimeUnit.MILLISECONDS);
}
catch(RejectedExecutionException e)
{
return null;
}
}
public ScheduledFuture scheduleGeneralAtFixedRate(Runnable r, long initial, long delay)
{
try
{
delay = validateDelay(delay);
initial = validateDelay(initial);
return _generalScheduledThreadPool.scheduleAtFixedRate(new RunnableWrapper(r), initial, delay, TimeUnit.MILLISECONDS);
}
catch(RejectedExecutionException e)
{
return null;
}
}
/**
* @deprecated Method removeGeneral is deprecated
*/
@Deprecated
public boolean removeGeneral(RunnableScheduledFuture r)
{
return _generalScheduledThreadPool.remove(r);
}
public ScheduledFuture scheduleAi(Runnable r, long delay)
{
try
{
delay = validateDelay(delay);
return _aiScheduledThreadPool.schedule(new RunnableWrapper(r), delay, TimeUnit.MILLISECONDS);
}
catch(RejectedExecutionException e)
{
return null;
}
}
public ScheduledFuture scheduleAiAtFixedRate(Runnable r, long initial, long delay)
{
try
{
delay = validateDelay(delay);
initial = validateDelay(initial);
return _aiScheduledThreadPool.scheduleAtFixedRate(new RunnableWrapper(r), initial, delay, TimeUnit.MILLISECONDS);
}
catch(RejectedExecutionException e)
{
return null;
}
}
public void executePacket(Runnable pkt)
{
_generalPacketsThreadPool.execute(pkt);
}
public void executeCommunityPacket(Runnable r)
{
_generalPacketsThreadPool.execute(r);
}
public void executeIOPacket(Runnable pkt)
{
_ioPacketsThreadPool.execute(pkt);
}
public void executeTask(Runnable r)
{
_generalThreadPool.execute(r);
}
public void executeAi(Runnable r)
{
_aiScheduledThreadPool.execute(new RunnableWrapper(r));
}
public String[] getStats()
{
return (new String[] {
"STP:", " + Effects:", (new StringBuilder()).append(" |- ActiveThreads: ").append(_effectsScheduledThreadPool.getActiveCount()).toString(), (new StringBuilder()).append(" |- getCorePoolSize: ").append(_effectsScheduledThreadPool.getCorePoolSize()).toString(), (new StringBuilder()).append(" |- PoolSize: ").append(_effectsScheduledThreadPool.getPoolSize()).toString(), (new StringBuilder()).append(" |- MaximumPoolSize: ").append(_effectsScheduledThreadPool.getMaximumPoolSize()).toString(), (new StringBuilder()).append(" |- CompletedTasks: ").append(_effectsScheduledThreadPool.getCompletedTaskCount()).toString(), (new StringBuilder()).append(" |- ScheduledTasks: ").append(_effectsScheduledThreadPool.getTaskCount() - _effectsScheduledThreadPool.getCompletedTaskCount()).toString(), " | -------", " + General:",
(new StringBuilder()).append(" |- ActiveThreads: ").append(_generalScheduledThreadPool.getActiveCount()).toString(), (new StringBuilder()).append(" |- getCorePoolSize: ").append(_generalScheduledThreadPool.getCorePoolSize()).toString(), (new StringBuilder()).append(" |- PoolSize: ").append(_generalScheduledThreadPool.getPoolSize()).toString(), (new StringBuilder()).append(" |- MaximumPoolSize: ").append(_generalScheduledThreadPool.getMaximumPoolSize()).toString(), (new StringBuilder()).append(" |- CompletedTasks: ").append(_generalScheduledThreadPool.getCompletedTaskCount()).toString(), (new StringBuilder()).append(" |- ScheduledTasks: ").append(_generalScheduledThreadPool.getTaskCount() - _generalScheduledThreadPool.getCompletedTaskCount()).toString(), " | -------", " + AI:", (new StringBuilder()).append(" |- ActiveThreads: ").append(_aiScheduledThreadPool.getActiveCount()).toString(), (new StringBuilder()).append(" |- getCorePoolSize: ").append(_aiScheduledThreadPool.getCorePoolSize()).toString(),
(new StringBuilder()).append(" |- PoolSize: ").append(_aiScheduledThreadPool.getPoolSize()).toString(), (new StringBuilder()).append(" |- MaximumPoolSize: ").append(_aiScheduledThreadPool.getMaximumPoolSize()).toString(), (new StringBuilder()).append(" |- CompletedTasks: ").append(_aiScheduledThreadPool.getCompletedTaskCount()).toString(), (new StringBuilder()).append(" |- ScheduledTasks: ").append(_aiScheduledThreadPool.getTaskCount() - _aiScheduledThreadPool.getCompletedTaskCount()).toString(), "TP:", " + Packets:", (new StringBuilder()).append(" |- ActiveThreads: ").append(_generalPacketsThreadPool.getActiveCount()).toString(), (new StringBuilder()).append(" |- getCorePoolSize: ").append(_generalPacketsThreadPool.getCorePoolSize()).toString(), (new StringBuilder()).append(" |- MaximumPoolSize: ").append(_generalPacketsThreadPool.getMaximumPoolSize()).toString(), (new StringBuilder()).append(" |- LargestPoolSize: ").append(_generalPacketsThreadPool.getLargestPoolSize()).toString(),
(new StringBuilder()).append(" |- PoolSize: ").append(_generalPacketsThreadPool.getPoolSize()).toString(), (new StringBuilder()).append(" |- CompletedTasks: ").append(_generalPacketsThreadPool.getCompletedTaskCount()).toString(), (new StringBuilder()).append(" |- QueuedTasks: ").append(_generalPacketsThreadPool.getQueue().size()).toString(), " | -------", " + I/O Packets:", (new StringBuilder()).append(" |- ActiveThreads: ").append(_ioPacketsThreadPool.getActiveCount()).toString(), (new StringBuilder()).append(" |- getCorePoolSize: ").append(_ioPacketsThreadPool.getCorePoolSize()).toString(), (new StringBuilder()).append(" |- MaximumPoolSize: ").append(_ioPacketsThreadPool.getMaximumPoolSize()).toString(), (new StringBuilder()).append(" |- LargestPoolSize: ").append(_ioPacketsThreadPool.getLargestPoolSize()).toString(), (new StringBuilder()).append(" |- PoolSize: ").append(_ioPacketsThreadPool.getPoolSize()).toString(),
(new StringBuilder()).append(" |- CompletedTasks: ").append(_ioPacketsThreadPool.getCompletedTaskCount()).toString(), (new StringBuilder()).append(" |- QueuedTasks: ").append(_ioPacketsThreadPool.getQueue().size()).toString(), " | -------", " + General Tasks:", (new StringBuilder()).append(" |- ActiveThreads: ").append(_generalThreadPool.getActiveCount()).toString(), (new StringBuilder()).append(" |- getCorePoolSize: ").append(_generalThreadPool.getCorePoolSize()).toString(), (new StringBuilder()).append(" |- MaximumPoolSize: ").append(_generalThreadPool.getMaximumPoolSize()).toString(), (new StringBuilder()).append(" |- LargestPoolSize: ").append(_generalThreadPool.getLargestPoolSize()).toString(), (new StringBuilder()).append(" |- PoolSize: ").append(_generalThreadPool.getPoolSize()).toString(), (new StringBuilder()).append(" |- CompletedTasks: ").append(_generalThreadPool.getCompletedTaskCount()).toString(),
(new StringBuilder()).append(" |- QueuedTasks: ").append(_generalThreadPool.getQueue().size()).toString(), " | -------", " + Javolution stats:", (new StringBuilder()).append(" |- FastList: ").append(FastList.report()).toString(), (new StringBuilder()).append(" |- FastMap: ").append(FastMap.report()).toString(), (new StringBuilder()).append(" |- FastSet: ").append(FastSet.report()).toString(), " | -------"
});
}
public void shutdown()
{
_shutdown = true;
try
{
_effectsScheduledThreadPool.awaitTermination(1L, TimeUnit.SECONDS);
_generalScheduledThreadPool.awaitTermination(1L, TimeUnit.SECONDS);
_generalPacketsThreadPool.awaitTermination(1L, TimeUnit.SECONDS);
_ioPacketsThreadPool.awaitTermination(1L, TimeUnit.SECONDS);
_generalThreadPool.awaitTermination(1L, TimeUnit.SECONDS);
_effectsScheduledThreadPool.shutdown();
_generalScheduledThreadPool.shutdown();
_generalPacketsThreadPool.shutdown();
_ioPacketsThreadPool.shutdown();
_generalThreadPool.shutdown();
_log.info("All ThreadPools are now stopped");
}
catch(InterruptedException e)
{
_log.log(Level.WARNING, "", e);
}
}
public boolean isShutdown()
{
return _shutdown;
}
public void purge()
{
_effectsScheduledThreadPool.purge();
_generalScheduledThreadPool.purge();
_aiScheduledThreadPool.purge();
_ioPacketsThreadPool.purge();
_generalPacketsThreadPool.purge();
_generalThreadPool.purge();
}
public String getPacketStats()
{
StringBuilder sb = new StringBuilder(1000);
ThreadFactory tf = _generalPacketsThreadPool.getThreadFactory();
if(tf instanceof PriorityThreadFactory)
{
PriorityThreadFactory ptf = (PriorityThreadFactory)tf;
int count = ptf.getGroup().activeCount();
Thread threads[] = new Thread[count + 2];
ptf.getGroup().enumerate(threads);
StringUtil.append(sb, new String[] {
"General Packet Thread Pool:\r\nTasks in the queue: ", String.valueOf(_generalPacketsThreadPool.getQueue().size()), "\r\nShowing threads stack trace:\r\nThere should be ", String.valueOf(count), " Threads\r\n"
});
Thread arr$[] = threads;
int len$ = arr$.length;
for(int i$ = 0; i$ < len$; i$++)
{
Thread t = arr$[i$];
if(t == null)
continue;
StringUtil.append(sb, new String[] {
t.getName(), "\r\n"
});
StackTraceElement arr$[] = t.getStackTrace();
int len$ = arr$.length;
for(int i$ = 0; i$ < len$; i$++)
{
StackTraceElement ste = arr$[i$];
StringUtil.append(sb, new String[] {
ste.toString(), "\r\n"
});
}
}
}
sb.append("Packet Tp stack traces printed.\r\n");
return sb.toString();
}
public String getIOPacketStats()
{
StringBuilder sb = new StringBuilder(1000);
ThreadFactory tf = _ioPacketsThreadPool.getThreadFactory();
if(tf instanceof PriorityThreadFactory)
{
PriorityThreadFactory ptf = (PriorityThreadFactory)tf;
int count = ptf.getGroup().activeCount();
Thread threads[] = new Thread[count + 2];
ptf.getGroup().enumerate(threads);
StringUtil.append(sb, new String[] {
"I/O Packet Thread Pool:\r\nTasks in the queue: ", String.valueOf(_ioPacketsThreadPool.getQueue().size()), "\r\nShowing threads stack trace:\r\nThere should be ", String.valueOf(count), " Threads\r\n"
});
Thread arr$[] = threads;
int len$ = arr$.length;
for(int i$ = 0; i$ < len$; i$++)
{
Thread t = arr$[i$];
if(t == null)
continue;
StringUtil.append(sb, new String[] {
t.getName(), "\r\n"
});
StackTraceElement arr$[] = t.getStackTrace();
int len$ = arr$.length;
for(int i$ = 0; i$ < len$; i$++)
{
StackTraceElement ste = arr$[i$];
StringUtil.append(sb, new String[] {
ste.toString(), "\r\n"
});
}
}
}
sb.append("Packet Tp stack traces printed.\r\n");
return sb.toString();
}
public String getGeneralStats()
{
StringBuilder sb = new StringBuilder(1000);
ThreadFactory tf = _generalThreadPool.getThreadFactory();
if(tf instanceof PriorityThreadFactory)
{
PriorityThreadFactory ptf = (PriorityThreadFactory)tf;
int count = ptf.getGroup().activeCount();
Thread threads[] = new Thread[count + 2];
ptf.getGroup().enumerate(threads);
StringUtil.append(sb, new String[] {
"General Thread Pool:\r\nTasks in the queue: ", String.valueOf(_generalThreadPool.getQueue().size()), "\r\nShowing threads stack trace:\r\nThere should be ", String.valueOf(count), " Threads\r\n"
});
Thread arr$[] = threads;
int len$ = arr$.length;
for(int i$ = 0; i$ < len$; i$++)
{
Thread t = arr$[i$];
if(t == null)
continue;
StringUtil.append(sb, new String[] {
t.getName(), "\r\n"
});
StackTraceElement arr$[] = t.getStackTrace();
int len$ = arr$.length;
for(int i$ = 0; i$ < len$; i$++)
{
StackTraceElement ste = arr$[i$];
StringUtil.append(sb, new String[] {
ste.toString(), "\r\n"
});
}
}
}
sb.append("Packet Tp stack traces printed.\r\n");
return sb.toString();
}
protected static final Logger _log = Logger.getLogger(l2/brick/gameserver/ThreadPoolManager.getName());
private ScheduledThreadPoolExecutor _effectsScheduledThreadPool;
private ScheduledThreadPoolExecutor _generalScheduledThreadPool;
private ScheduledThreadPoolExecutor _aiScheduledThreadPool;
private ThreadPoolExecutor _generalPacketsThreadPool;
private ThreadPoolExecutor _ioPacketsThreadPool;
private ThreadPoolExecutor _generalThreadPool;
private static final long MAX_DELAY = 0x431bde82d7bL;
private boolean _shutdown;
}