Java ScheduledThreadPoolExecutor示例
有多种方法可以在Java中安排任务。
我们已经拥有Java Timer来安排任务,但定时器任务的问题是我们可以一次执行一个任务。
因此,如果当前任务需要更长时间的作业将会延迟。
在这种情况下,我们可以使用Java ScheduledThreadPoolExecutor.This类是executor框架的一部分,并提供设施来安排任务而不是立即执行它。
我们可以使用三种方法使用scheduledThreadPoolExecutor计划任务。
- schedule
- scheduleatfixedrate.
- schedulewithfixeddelay.
Java ScheduledThreadPoolExecutor示例:
第1步:创建一个名为"runnableTask.java"的runnable任务。
package org.igi.theitroad; import java.util.Date; public class RunnableTask implements Runnable{ private String taskName; public RunnableTask(String s){ this.taskName=s; } @Override public void run() { System.out.println(Thread.currentThread().getName()+" Start Time for "+taskName+" "+new Date()); //Process task here try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" End Time for "+taskName+" "+new Date()); } @Override public String toString(){ return this.taskName; } }
第2步:
package org.igi.theitroad; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduledThreadPoolMain { public static void main(String[] args) throws InterruptedException { System.out.println("Current Time = "+new Date()); //Created ScheduledThreadPoolExecutor object ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3); for(int i=1; i<=3; i++){ Thread.sleep(2000); RunnableTask task = new RunnableTask("Task "+i); scheduledThreadPool.schedule(task,5, TimeUnit.SECONDS); } //Adding some delay Thread.sleep(10000); scheduledThreadPool.shutdown(); System.out.println("Completed all threads"); } }
让我们更多地了解主要方法。
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
ScheduledThreadPoolExecutor还有工厂方法名为NewscheduledThreadPool的Experutors类类似于NewFixedThreadPoolExecutor和NewCachedThreadPoolexectuor。
我们需要将计划方法调用为任务安排。
计划方法需要三个参数:
public ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit):
Runnable命令:它表示要计划的任务。
长期延迟:它代表我们要安排任务的初步延迟。
时间单位:它是延迟参数的时间措施。
如果我们注意到,计划方法返回ScheduledFuture<?>
的对象。我们可以用它获取提交作业的状态。
我们也称为scheduledthreadpool.shutdown(),shutdown()方法将bydefault等待提交的任务来执行,然后终止。
我们可以使用setExecuteexistingDelayedTaskSaftersHutdownPolicy()更改此策略。
运行上面的程序时,我们将得到以下输出:
Current Time = Fri Jan 19 00:20:39 IST 2016 pool-1-thread-1 Start Time for Task 1 Fri Jan 19 00:20:46 IST 2016 pool-1-thread-2 Start Time for Task 2 Fri Jan 19 00:20:48 IST 2016 pool-1-thread-3 Start Time for Task 3 Fri Jan 19 00:20:50 IST 2016 pool-1-thread-1 End Time for Task 1 Fri Jan 19 00:20:51 IST 2016 pool-1-thread-2 End Time for Task 2 Fri Jan 19 00:20:53 IST 2016 pool-1-thread-3 End Time for Task 3 Fri Jan 19 00:20:55 IST 2016 Completed all threads
scheduledthreadpootexecutor的scheduleatfixedrate示例:
ScheduledThreadPoolExecutor的ScheduleAtFixEdrate用于在修复延迟后计划任务,然后定期执行该任务。
scheduleatfixedrate方法需要四个参数:
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit)
Runnable命令:它代表要计划的任务。
long initialdelay:它代表了要安排任务的初始延迟。
长期:它代表我们要重复任务的时间。
时间单位:它是延迟参数的时间措施。
让我们在ScheduledThreadPoolMain中调用scheduleatfixedrate的一些更改。
package org.igi.theitroad; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduledThreadPoolMain { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { System.out.println("Current Time = "+new Date()); //Created ScheduledThreadPoolExecutor object ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3); for(int i=1; i<=3; i++){ Thread.sleep(2000); RunnableTask task = new RunnableTask("Task "+i); scheduledThreadPool.scheduleAtFixedRate(task,5,10,TimeUnit.SECONDS); } //Adding some delay Thread.sleep(15000); scheduledThreadPool.shutdown(); while(!scheduledThreadPool.isTerminated()){ //wait for all tasks to finish } System.out.println("Completed all threads"); } }
运行上面的程序时,我们将得到以下输出:
Current Time = Fri Jan 19 00:56:29 IST 2016 pool-1-thread-1 Start Time for Task 1 Fri Jan 19 00:56:36 IST 2016 pool-1-thread-2 Start Time for Task 2 Fri Jan 19 00:56:38 IST 2016 pool-1-thread-3 Start Time for Task 3 Fri Jan 19 00:56:40 IST 2016 pool-1-thread-1 End Time for Task 1 Fri Jan 19 00:56:41 IST 2016 pool-1-thread-2 End Time for Task 2 Fri Jan 19 00:56:43 IST 2016 pool-1-thread-3 End Time for Task 3 Fri Jan 19 00:56:45 IST 2016 pool-1-thread-1 Start Time for Task 1 Fri Jan 19 00:56:46 IST 2016 pool-1-thread-2 Start Time for Task 2 Fri Jan 19 00:56:48 IST 2016 pool-1-thread-3 Start Time for Task 3 Fri Jan 19 00:56:50 IST 2016 pool-1-thread-1 End Time for Task 1 Fri Jan 19 00:56:51 IST 2016 pool-1-thread-2 End Time for Task 2 Fri Jan 19 00:56:53 IST 2016 pool-1-thread-3 End Time for Task 3 Fri Jan 19 00:56:55 IST 2016 Completed all threads
如果仔细观察输出:
pool-1-thread-1 Start Time for Task 1 Fri Jan 19 00:56:36 IST 2016 pool-1-thread-1 Start Time for Task 1 Fri Jan 19 00:56:46 IST 2016
一旦任务1开始,下一个任务计划在ScheduleAtFixedRate方法中提供的10秒之后。
scheduledthreadpootexecutor的schedulewithfixeddelay示例:
ScheduledThreadPoolExecutor的SchedulewithFixedDelay用于在初始延迟后计划任务,然后在完成上一个任务完成后使用固定延迟执行任务。
让我们在ScheduledThreadPoolMain中调用schedulewithfixeddelay进行一些更改。
package org.igi.theitroad; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduledThreadPoolMain { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { System.out.println("Current Time = "+new Date()); //Created ScheduledThreadPoolExecutor object ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3); for(int i=1; i<=3; i++){ Thread.sleep(2000); RunnableTask task = new RunnableTask("Task "+i); scheduledThreadPool.scheduleWithFixedDelay(task,5,10,TimeUnit.SECONDS); } //Adding some delay Thread.sleep(30000); scheduledThreadPool.shutdown(); while(!scheduledThreadPool.isTerminated()){ //wait for all tasks to finish } System.out.println("Completed all threads"); } }
Current Time = Fri Jan 19 00:20:39 IST 2016 Current Time = Fri Jan 19 00:50:53 IST 2016 pool-1-thread-1 Start Time for Task 1 Fri Jan 19 00:51:00 IST 2016 pool-1-thread-2 Start Time for Task 2 Fri Jan 19 00:51:02 IST 2016 pool-1-thread-3 Start Time for Task 3 Fri Jan 19 00:51:04 IST 2016 pool-1-thread-1 End Time for Task 1 Fri Jan 19 00:51:05 IST 2016 pool-1-thread-2 End Time for Task 2 Fri Jan 19 00:51:07 IST 2016 pool-1-thread-3 End Time for Task 3 Fri Jan 19 00:51:09 IST 2016 pool-1-thread-1 Start Time for Task 1 Fri Jan 19 00:51:15 IST 2016 pool-1-thread-2 Start Time for Task 2 Fri Jan 19 00:51:17 IST 2016 pool-1-thread-3 Start Time for Task 3 Fri Jan 19 00:51:19 IST 2016 pool-1-thread-1 End Time for Task 1 Fri Jan 19 00:51:20 IST 2016 pool-1-thread-2 End Time for Task 2 Fri Jan 19 00:51:22 IST 2016 pool-1-thread-3 End Time for Task 3 Fri Jan 19 00:51:24 IST 2016 Completed all threads
如果仔细观察输出:
pool-1-thread-1 End Time for Task 1 Fri Jan 19 00:51:05 IST 2016 pool-1-thread-1 Start Time for Task 1 Fri Jan 19 00:51:15 IST 2016
一旦任务1结束,下一个任务在延迟延迟10秒之后,它在SchedulewithfixedDelay方法提供了10秒之后。