public static JobScheduler createInitialisedScheduler() { CentralJobScheduler scheduler = createCentralScheduler(); scheduler.init(); return scheduler; }
JobHandle submit( Group group, Runnable job ) { ThreadPool threadPool = getThreadPool( group ); return threadPool.submit( job ); }
@Override public ThreadFactory threadFactory( Group group ) { return pools.getThreadPool( group ).getThreadFactory(); }
protected JobScheduler createJobScheduler() { return JobSchedulerFactory.createInitialisedScheduler(); }
protected CentralJobScheduler() { workStealingExecutors = new ConcurrentHashMap<>( 1 ); topLevelGroup = new TopLevelGroup(); pools = new ThreadPoolManager( topLevelGroup ); ThreadFactory threadFactory = new GroupedDaemonThreadFactory( Group.TASK_SCHEDULER, topLevelGroup ); scheduler = new TimeBasedTaskScheduler( Clocks.nanoClock(), pools ); // The scheduler thread runs at slightly elevated priority for timeliness, and is started in init(). schedulerThread = threadFactory.newThread( scheduler ); int priority = Thread.NORM_PRIORITY + 1; schedulerThread.setPriority( priority ); }
@Test public void mustRescheduleRecurringTasks() throws Exception { scheduler.submit( Group.STORAGE_MAINTENANCE, semaphore::release, 100, 100 ); clock.forward( 100, TimeUnit.NANOSECONDS ); scheduler.tick(); assertSemaphoreAcquire(); clock.forward( 100, TimeUnit.NANOSECONDS ); scheduler.tick(); assertSemaphoreAcquire(); }
@Override public Executor executor( Group group ) { return job -> schedule( group, job ); }
private static CentralJobScheduler createCentralScheduler() { return new CentralJobScheduler(); } }
@Override public void close() { shutdown(); }
@Override public JobHandle scheduleRecurring( Group group, final Runnable runnable, long period, TimeUnit timeUnit ) { return scheduleRecurring( group, runnable, 0, period, timeUnit ); }
void submitIfRunnable( ThreadPoolManager pools ) { if ( compareAndSet( RUNNABLE, SUBMITTED ) ) { latestHandle = pools.submit( group, task ); handleRelease.release(); } }
public JobHandle submit( Group group, Runnable job, long initialDelayNanos, long reschedulingDelayNanos ) { long now = clock.nanos(); long nextDeadlineNanos = now + initialDelayNanos; ScheduledJobHandle task = new ScheduledJobHandle( this, group, job, nextDeadlineNanos, reschedulingDelayNanos ); enqueueTask( task ); return task; }
@Override public ExecutorService workStealingExecutor( Group group, int parallelism ) { return workStealingExecutor( group, parallelism, false ); }
@Override public void setTopLevelGroupName( String name ) { try { topLevelGroup.setName( name ); } catch ( Exception ignore ) { } }
public static JobScheduler createScheduler() { return createCentralScheduler(); }
private void replayBuffer() { Runnable command = pollRunnable(); while ( command != null ) { realExecutor.execute( command ); command = pollRunnable(); } }
public void satisfyWith( Executor executor ) { synchronized ( this ) { if ( realExecutor != null ) { throw new RuntimeException( "real executor is already set. Cannot override" ); } realExecutor = executor; replayBuffer(); } }
private void awaitFirstInvocation() throws InterruptedException { awaitInvocationCount( 1 ); }
@Override public JobHandle schedule( Group group, Runnable job ) { return super.schedule( group, slowRunnable( job ) ); } };
@Override public ExecutorService workStealingExecutorAsyncMode( Group group, int parallelism ) { return workStealingExecutor( group, parallelism, true ); }