public void maybeExecuteImmediately(Runnable command) { FutureTask<?> ft = newTaskFor(command, null); if (!takeWorkPermit(false)) { addTask(ft); } else { try { ft.run(); } finally { returnWorkPermit(); // we have to maintain our invariant of always scheduling after any work is performed // in this case in particular we are not processing the rest of the queue anyway, and so // the work permit may go wasted if we don't immediately attempt to spawn another worker maybeSchedule(); } } }
SEPExecutor(SharedExecutorPool pool, int maxWorkers, int maxTasksQueued) { this.pool = pool; this.maxWorkers = maxWorkers; this.maxTasksQueued = maxTasksQueued; this.permits.set(combine(0, maxWorkers)); }
public Integer getValue() { return executor.getActiveCount(); } });
public synchronized List<Runnable> shutdownNow() { shutdown(); List<Runnable> aborted = new ArrayList<>(); while (takeTaskPermit()) aborted.add(tasks.poll()); return aborted; }
assigned.maybeSchedule(); if ((shutdown = assigned.shuttingDown) || !assigned.takeTaskPermit()) break; task = assigned.tasks.poll(); assigned.returnWorkPermit(); if (shutdown && assigned.getActiveCount() == 0) assigned.shutdown.signalAll(); assigned = null; assigned.returnWorkPermit(); if (task != null) logger.error("Failed to execute task, unexpected exception killed worker: {}", t);
boolean takeWorkPermit(boolean takeTaskPermit) { int taskDelta = takeTaskPermit ? 1 : 0; while (true) { long current = permits.get(); int workPermits = workPermits(current); int taskPermits = taskPermits(current); if (workPermits == 0 || taskPermits == 0) return false; if (permits.compareAndSet(current, combine(taskPermits - taskDelta, workPermits - 1))) { if (takeTaskPermit && taskPermits == maxTasksQueued && hasRoom.hasWaiters()) hasRoom.signalAll(); return true; } } }
private void stopSpinning() { if (pool.spinningCount.decrementAndGet() == 0) for (SEPExecutor executor : pool.executors) executor.maybeSchedule(); prevStopCheck = soleSpinnerSpinTime = 0; }
public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException { shutdown.await(timeout, unit); return isTerminated(); }
public Long getValue() { return executor.getPendingTasks(); } });
public Long getValue() { return executor.getCompletedTasks(); } });
@Override public synchronized void shutdown() { // synchronized, because there is no way to access super.mainLock, which would be // the preferred way to make this threadsafe if (!isShutdown()) { unregisterMBean(); } super.shutdown(); }
assigned.maybeSchedule(); if ((shutdown = assigned.shuttingDown) || !assigned.takeTaskPermit()) break; task = assigned.tasks.poll(); assigned.returnWorkPermit(); if (shutdown && assigned.getActiveCount() == 0) assigned.shutdown.signalAll(); assigned = null; assigned.returnWorkPermit(); if (task != null) logger.error("Failed to execute task, unexpected exception killed worker: {}", t);
boolean takeWorkPermit(boolean takeTaskPermit) { int taskDelta = takeTaskPermit ? 1 : 0; while (true) { long current = permits.get(); int workPermits = workPermits(current); int taskPermits = taskPermits(current); if (workPermits == 0 || taskPermits == 0) return false; if (permits.compareAndSet(current, combine(taskPermits - taskDelta, workPermits - 1))) { if (takeTaskPermit && taskPermits == maxTasksQueued && hasRoom.hasWaiters()) hasRoom.signalAll(); return true; } } }
public synchronized List<Runnable> shutdownNow() { shutdown(); List<Runnable> aborted = new ArrayList<>(); while (takeTaskPermit()) aborted.add(tasks.poll()); return aborted; }
private void stopSpinning() { if (pool.spinningCount.decrementAndGet() == 0) for (SEPExecutor executor : pool.executors) executor.maybeSchedule(); prevStopCheck = soleSpinnerSpinTime = 0; }
public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException { shutdown.await(timeout, unit); return isTerminated(); }
public Long getValue() { return executor.getPendingTasks(); } });
public Long getValue() { return executor.getCompletedTasks(); } });
public void maybeExecuteImmediately(Runnable command) { FutureTask<?> ft = newTaskFor(command, null); if (!takeWorkPermit(false)) { addTask(ft); } else { try { ft.run(); } finally { returnWorkPermit(); // we have to maintain our invariant of always scheduling after any work is performed // in this case in particular we are not processing the rest of the queue anyway, and so // the work permit may go wasted if we don't immediately attempt to spawn another worker maybeSchedule(); } } }
assigned.maybeSchedule(); if ((shutdown = assigned.shuttingDown) || !assigned.takeTaskPermit()) break; task = assigned.tasks.poll(); assigned.returnWorkPermit(); if (shutdown && assigned.getActiveCount() == 0) assigned.shutdown.signalAll(); assigned = null; assigned.returnWorkPermit(); if (task != null) logger.error("Failed to execute task, unexpected exception killed worker: {}", t);