//A timed task that can be delayed to execute //Look at the constructor first The most important difference in the constructor is that a delayed queue is passed in to DelayedWorkQueue /** Summary: The thread pool inherits ThreadPoolExecutor. At the same time, it encapsulates a DelayedWorkQueue and ScheduledFutureTask. DelayedWorkQueue is used to manage the addition and acquisition of tasks. ScheduledFutureTask Used to manage the execution of tasks. */ public ScheduledThreadPoolExecutor(int corePoolSize) { super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS, new DelayedWorkQueue()); } public ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory) { super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS, new DelayedWorkQueue(), threadFactory); } public ScheduledThreadPoolExecutor(int corePoolSize, RejectedExecutionHandler handler) { super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS, new DelayedWorkQueue(), handler); } public ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler handler) { super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS, new DelayedWorkQueue(), threadFactory, handler); } //create and execute task public void execute(Runnable command) { schedule(command, 0, TimeUnit.NANOSECONDS); } //Delayed execution of Runnable tasks public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) { if (command == null || unit == null) throw new NullPointerException(); // Decorate the Task, which is equivalent to converting the task into a RunnableScheduledFuture RunnableScheduledFuture<?> t = decorateTask(command, new ScheduledFutureTask<Void>(command, null, triggerTime(delay, unit))); delayedExecute(t); return t; } private void delayedExecute(RunnableScheduledFuture<?> task) { //The thread is closed and no longer processing tasks if (isShutdown()) reject(task); else { // add the task to the queue super.getQueue().add(task); if (isShutdown() && !canRunInCurrentRunState(task.isPeriodic()) && remove(task)) task.cancel(false); else ensurePrestart(); } } //create thread void ensurePrestart() { int wc = workerCountOf(ctl.get()); if (wc < corePoolSize) //Use corePoolSize to decide whether to create a thread addWorker(null, true); else if (wc == 0) //Use maximumPoolSize to decide whether to create a thread addWorker(null, false); } //Look at the thread execution method public void run() { boolean periodic = isPeriodic(); if (!canRunInCurrentRunState(periodic)) cancel(false); // execute directly without delay else if (!periodic) ScheduledFutureTask.super.run(); // execute first else if (ScheduledFutureTask.super.runAndReset()) { //Set the next time to execute setNextRunTime(); reExecutePeriodic(outerTask); } } void reExecutePeriodic(RunnableScheduledFuture<?> task) { if (canRunInCurrentRunState(true)) { super.getQueue().add(task); if (!canRunInCurrentRunState(true) && remove(task)) task.cancel(false); else ensurePrestart(); } } //Delayed execution of Callable task public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) { if (callable == null || unit == null) throw new NullPointerException(); RunnableScheduledFuture<V> t = decorateTask(callable, new ScheduledFutureTask<V>(callable, triggerTime(delay, unit))); delayedExecute(t); return t; } // execute the task immediately public Future<?> submit(Runnable task) { return schedule(task, 0, TimeUnit.NANOSECONDS); } // execute the task immediately public <T> Future<T> submit(Runnable task, T result) { return schedule(Executors.callable(task, result), 0, TimeUnit.NANOSECONDS); } // execute the task immediately public <T> Future<T> submit(Callable<T> task) { return schedule(task, 0, TimeUnit.NANOSECONDS); } //Execute after every initialDelay+period. The next time is initialDelay+period*2 and so on public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { if (command == null || unit == null) throw new NullPointerException(); if (period <= 0) throw new IllegalArgumentException(); ScheduledFutureTask<Void> sft = new ScheduledFutureTask<Void>(command, null, triggerTime(initialDelay, unit), unit.toNanos(period)); RunnableScheduledFuture<Void> t = decorateTask(command, sft); sft.outerTask = t; delayedExecute(t); return t; } //equivalent to time decrement public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) { if (command == null || unit == null) throw new NullPointerException(); if (delay <= 0) throw new IllegalArgumentException(); ScheduledFutureTask<Void> sft = new ScheduledFutureTask<Void>(command, null, triggerTime(initialDelay, unit), unit.toNanos(-delay)); RunnableScheduledFuture<Void> t = decorateTask(command, sft); sft.outerTask = t; delayedExecute(t); return t; }
Read ScheduledThreadPoolExecutor source code
Guess you like
Origin http://43.154.161.224:23101/article/api/json?id=326476232&siteId=291194637
Recommended
Ranking