Class ExecutorJobScheduler
- All Implemented Interfaces:
JobScheduler
JobScheduler over a plain Executor. A job the executor refuses with a
RejectedExecutionException, as a bounded pool with no queue does when all of its threads are busy, runs on
the submitting thread instead, so no job is ever dropped; over a pool with no queue, such as newHelperPool(int, java.util.concurrent.ThreadFactory)
makes, no job ever waits in a queue behind another either.
It is meant for a pool shaped like newHelperPool(int, java.util.concurrent.ThreadFactory), which may be small and shared by many callers, and on
which a job may itself invoke a nested iteration; the pool's size bounds the threads a caller adds to its own, never
the work it can finish.
A caller of JobScheduler.invokeParallel(io.deephaven.engine.context.ExecutionContext, io.deephaven.base.log.LogOutputAppendable, java.util.function.Supplier<CONTEXT_TYPE>, int, int, io.deephaven.engine.table.impl.util.JobScheduler.IterateAction<CONTEXT_TYPE>) idles only once no task is left for it to claim: it then waits for the tasks that
helpers already started. It never waits on a helper that has not started, since it runs any such helper itself, so
this holds for any executor. A task that itself calls invokeParallel is such a caller too, and works through
its nested iteration the same way; when the pool has no free thread, its nested helpers run on its own thread and it
does not wait at all.
Like the other schedulers, an instance accumulates the performance of the jobs that ran off the submitting thread, so make one per operation, over an executor that outlives it.
-
Nested Class Summary
Nested classes/interfaces inherited from interface io.deephaven.engine.table.impl.util.JobScheduler
JobScheduler.IterateAction<CONTEXT_TYPE extends JobScheduler.JobThreadContext>, JobScheduler.IterateResumeAction<CONTEXT_TYPE extends JobScheduler.JobThreadContext>, JobScheduler.IterationManager<CONTEXT_TYPE extends JobScheduler.JobThreadContext>, JobScheduler.JobThreadContext -
Field Summary
Fields inherited from interface io.deephaven.engine.table.impl.util.JobScheduler
DEFAULT_CONTEXT, DEFAULT_CONTEXT_FACTORY, UNREPORTABLE_JOB_ERROR -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionThe performance statistics of all runnables that have been completed off-thread, or null if all were executed in the current thread.static ThreadPoolExecutornewHelperPool(int maxThreads, @NotNull ThreadFactory threadFactory) Make the pool this scheduler is designed for: up tomaxThreadsthreads, made when needed and retired after a minute without work, and no queue, so that a job either gets a thread at once or is refused.voidsubmit(ExecutionContext executionContext, Runnable runnable, LogOutputAppendable description, Consumer<Exception> onError) Cause runnable to be executed.intHow many threads exist in the job scheduler? The job submitters can use this value to determine how many sub-jobs to split work into.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface io.deephaven.engine.table.impl.util.JobScheduler
invokeParallel, iterateParallel, iterateParallel, iterateSerial
-
Constructor Details
-
ExecutorJobScheduler
- Parameters:
executor- runs the jobs; it may refuse one with aRejectedExecutionException, which then runs on the submitting threadthreadCount- the most threads, the submitting thread included, that one iteration on this scheduler should use; an iteration asks the executor for one fewer than this when the caller takes part
-
-
Method Details
-
newHelperPool
public static ThreadPoolExecutor newHelperPool(int maxThreads, @NotNull @NotNull ThreadFactory threadFactory) Make the pool this scheduler is designed for: up tomaxThreadsthreads, made when needed and retired after a minute without work, and no queue, so that a job either gets a thread at once or is refused. The pool is never shut down by this class; give it daemon threads.- Parameters:
maxThreads- the most threads the pool holdsthreadFactory- makes the pool's threads- Returns:
- the pool
-
submit
public void submit(ExecutionContext executionContext, Runnable runnable, LogOutputAppendable description, Consumer<Exception> onError) Description copied from interface:JobSchedulerCause runnable to be executed.A scheduler runs every job it accepts: at once, after queuing it, or, when it has no thread free and no queue to hold the job, on the calling thread. A scheduler that cannot take a job at all throws instead, and the job does not run.
- Specified by:
submitin interfaceJobScheduler- Parameters:
executionContext- the execution context to run it underrunnable- the runnable to executedescription- a description for loggingonError- a routine to call if an exception occurs while running runnable
-
getAccumulatedPerformance
Description copied from interface:JobSchedulerThe performance statistics of all runnables that have been completed off-thread, or null if all were executed in the current thread.When initializing an operation, the
OperationInitializerJobSchedulerexecutes the completion callback as part of another task. Therefore, you must not read the accumulated performance from the completion callback when initializing an operation; as it could miss data from some of the tasks. Furthermore, even though the completion callback identifies the result as ready does not mean that the completion callback has actually completed. To guard against this theOperationInitializerJobSchedulerwaits for all jobs to be complete before returning theBasePerformanceEntry. Therefore, if you call this from a completion callback, then the operation will hang.ExecutorJobSchedulerwaits the same way, so the same applies to it.- Specified by:
getAccumulatedPerformancein interfaceJobScheduler
-
threadCount
public int threadCount()Description copied from interface:JobSchedulerHow many threads exist in the job scheduler? The job submitters can use this value to determine how many sub-jobs to split work into.- Specified by:
threadCountin interfaceJobScheduler
-