private void _doAddWorkerThread(Runnable runnable) { WorkerTask workerTask = new WorkerTask(runnable); _workerTasks.add(workerTask); int poolSize = ++_poolSize; if (poolSize > _largestPoolSize) { _largestPoolSize = poolSize; } workerTask._startWork(); }
public int getActiveCount() { _mainLock.lock(); try { int count = 0; for (WorkerTask workerTask : _workerTasks) { if (workerTask._isLocked()) { count++; } } return count; } finally { _mainLock.unlock(); } }
public long getTaskCount() { _mainLock.lock(); try { long count = _completedTaskCount; for (WorkerTask workerTask : _workerTasks) { count += workerTask._localCompletedTaskCount; if (workerTask._isLocked()) { count++; } } return count + _taskQueue.size(); } finally { _mainLock.unlock(); } }
public void adjustPoolSize(int newCorePoolSize, int newMaxPoolSize) { if ((newCorePoolSize < 0) || (newMaxPoolSize <= 0) || (newMaxPoolSize < newCorePoolSize)) { throw new IllegalArgumentException(); } _mainLock.lock(); try { int surplusCoreThreads = _corePoolSize - newCorePoolSize; int surplusMaxPoolSize = _maxPoolSize - newMaxPoolSize; _corePoolSize = newCorePoolSize; _maxPoolSize = newMaxPoolSize; if (((surplusCoreThreads > 0) && (_poolSize > _corePoolSize)) || ((surplusMaxPoolSize > 0) && (_poolSize > _maxPoolSize))) { int interruptCount = Math.max(surplusCoreThreads, surplusMaxPoolSize); for (WorkerTask workerTask : _workerTasks) { if (interruptCount > 0) { if (workerTask._interruptIfWaiting()) { interruptCount--; } } else { break; } } } else { Runnable runnable = null; while ((surplusCoreThreads++ < 0) && (_poolSize < _corePoolSize) && ((runnable = _taskQueue.poll()) != null)) { _doAddWorkerThread(runnable); } } } finally { _mainLock.unlock(); } }
@Override public void shutdown() { _mainLock.lock(); try { int state = _runState; if (state < _SHUTDOWN) { _runState = _SHUTDOWN; } for (WorkerTask workerTask : _workerTasks) { workerTask._interruptIfWaiting(); } _tryTerminate(); } finally { _mainLock.unlock(); } }