@Test public void workerIdleTest() { final Worker w = new Worker(workerPool, workerPool.threadFactory); w.start(); // wait for worker to become idle new TestCondition(() -> workerPool.idleWorker.get(), (o) -> o == w).blockTillTrue(); workerPool.startShutdown(); workerPool.finishShutdown(); // verify idle worker is gone new TestCondition(() -> workerPool.idleWorker.get() == null).blockTillTrue(); // should return immediately now that we are shut down workerPool.workerIdle(new Worker(workerPool, workerPool.threadFactory)); } }
@Override public TaskWrapper workerIdle(Worker worker) { TaskWrapper result = super.workerIdle(worker); // may not be a wrapper for internal tasks like shutdown if (result != null && result.getContainedRunnable() instanceof TaskStatWrapper) { long taskDelay = Clock.lastKnownForwardProgressingMillis() - result.getPureRunTime(); TaskStatWrapper statWrapper = (TaskStatWrapper)result.getContainedRunnable(); ConcurrentArrayList<Long> priorityStats = statsManager.getExecutionDelaySamplesInternal(statWrapper.priority); synchronized (priorityStats.getModificationLock()) { priorityStats.add(taskDelay); statsManager.trimWindow(priorityStats); } } return result; } }
@Override public TaskWrapper workerIdle(Worker worker) { TaskWrapper result = super.workerIdle(worker); // may not be a wrapper for internal tasks like shutdown if (result != null && result.getContainedRunnable() instanceof TaskStatWrapper) { long taskDelay = Clock.lastKnownForwardProgressingMillis() - result.getPureRunTime(); TaskStatWrapper statWrapper = (TaskStatWrapper)result.getContainedRunnable(); ConcurrentArrayList<Long> priorityStats = statsManager.getExecutionDelaySamplesInternal(statWrapper.priority); synchronized (priorityStats.getModificationLock()) { priorityStats.add(taskDelay); statsManager.trimWindow(priorityStats); } } return result; } }
protected void executeTasksWhileRunning() { while (isRunning()) { TaskWrapper nextTask = workerPool.workerIdle(this); if (nextTask != null) { // may be null if we are shutting down nextTask.runTask(); } } }
protected void executeTasksWhileRunning() { while (isRunning()) { TaskWrapper nextTask = workerPool.workerIdle(this); if (nextTask != null) { // may be null if we are shutting down nextTask.runTask(); } } }