第六章JavaScheduledThreadPoolExecutor示例|
有多种方法可以在 java 中安排任务。我们已经有Java timer来安排任务,但是 timers 任务的问题是您一次只能执行一个任务。因此,如果当前任务需要更长的时间,后续作业将被延迟。
在这种情况下,您可以使用 Java ScheduledThreadPoolExecutor。这个类是 Executor 框架的一部分,它提供了安排任务而不是立即执行任务的工具。 您可以使用三种方法来使用 ScheduledThreadPoolExecutor 来安排任务。
第 1 步:创建一个名为“RunnableTask.java”的可运行任务。
package org.arpit.java2blog;
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.arpit.java2blog;
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 在 Executors 类中也有名为 newScheduledThreadPool 的工厂方法,类似于 newFixedThreadPoolExecutor 和 newCachedThreadPoolExectuor。 您需要调用 schedule 方法来安排任务。 schedule 方法接受三个参数: public ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit): Runnable command:表示要调度的任务。 长时间延迟:它表示您要安排任务的初始延迟。 TimeUnit 单位:延迟参数的时间度量。 如果您注意到, schedule 方法会返回 ScheduledFuture<?> 的对象,您可以使用它来获取已提交作业的状态。
我们还调用了scheduledThreadPool.shutdown(),shutdown()方法默认会等待提交的任务执行然后终止。您可以使用 setExecuteExistingDelayedTasksAfterShutdownPolicy() 更改此策略。
当你运行上面的程序时,你会得到下面的输出:
Current Time = Fri May 19 00:20:39 IST 2017
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:20:46 IST 2017
pool-1-thread-2 Start Time for Task 2 Fri May 19 00:20:48 IST 2017
pool-1-thread-3 Start Time for Task 3 Fri May 19 00:20:50 IST 2017
pool-1-thread-1 End Time for Task 1 Fri May 19 00:20:51 IST 2017
pool-1-thread-2 End Time for Task 2 Fri May 19 00:20:53 IST 2017
pool-1-thread-3 End Time for Task 3 Fri May 19 00:20:55 IST 2017
Completed all threads
ScheduledThreadPoolExecutor 的 scheduleAtFixedRate 示例:
ScheduledThreadPoolExecutor 的 scheduleAtFixedRate 用于在修复延迟后调度任务,然后定期执行该任务。 scheduleAtFixedRate 方法有四个参数: public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit) Runnable command:表示要调度的任务。 long initialDelay:它表示您要安排任务的初始延迟。 长周期:它表示您要重复任务的周期。 TimeUnit 单位:延迟参数的时间度量。 让我们做一些更改来调用 ScheduledThreadPoolMain 中的 scheduleAtFixedRate。
package org.arpit.java2blog;
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 May 19 00:56:29 IST 2017
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:56:36 IST 2017
pool-1-thread-2 Start Time for Task 2 Fri May 19 00:56:38 IST 2017
pool-1-thread-3 Start Time for Task 3 Fri May 19 00:56:40 IST 2017
pool-1-thread-1 End Time for Task 1 Fri May 19 00:56:41 IST 2017
pool-1-thread-2 End Time for Task 2 Fri May 19 00:56:43 IST 2017
pool-1-thread-3 End Time for Task 3 Fri May 19 00:56:45 IST 2017
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:56:46 IST 2017
pool-1-thread-2 Start Time for Task 2 Fri May 19 00:56:48 IST 2017
pool-1-thread-3 Start Time for Task 3 Fri May 19 00:56:50 IST 2017
pool-1-thread-1 End Time for Task 1 Fri May 19 00:56:51 IST 2017
pool-1-thread-2 End Time for Task 2 Fri May 19 00:56:53 IST 2017
pool-1-thread-3 End Time for Task 3 Fri May 19 00:56:55 IST 2017
Completed all threads
如果仔细观察输出:
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:56:36 IST 2017
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:56:46 IST 2017
一旦任务 1 开始,下一个任务会在 scheduleAtFixedRate 方法中提供的 10 秒后安排。
ScheduledThreadPoolExecutor 的 scheduleWithFixedDelay 示例:
ScheduledThreadPoolExecutor 的 scheduleWithFixedDelay 用于在初始延迟后调度一个任务,然后在前一个任务完成后以固定延迟执行任务。 让我们做一些更改来调用 ScheduledThreadPoolMain 中的 scheduleWithFixedDelay。
package org.arpit.java2blog;
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 May 19 00:20:39 IST 2017
Current Time = Fri May 19 00:50:53 IST 2017
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:51:00 IST 2017
pool-1-thread-2 Start Time for Task 2 Fri May 19 00:51:02 IST 2017
pool-1-thread-3 Start Time for Task 3 Fri May 19 00:51:04 IST 2017
pool-1-thread-1 End Time for Task 1 Fri May 19 00:51:05 IST 2017
pool-1-thread-2 End Time for Task 2 Fri May 19 00:51:07 IST 2017
pool-1-thread-3 End Time for Task 3 Fri May 19 00:51:09 IST 2017
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:51:15 IST 2017
pool-1-thread-2 Start Time for Task 2 Fri May 19 00:51:17 IST 2017
pool-1-thread-3 Start Time for Task 3 Fri May 19 00:51:19 IST 2017
pool-1-thread-1 End Time for Task 1 Fri May 19 00:51:20 IST 2017
pool-1-thread-2 End Time for Task 2 Fri May 19 00:51:22 IST 2017
pool-1-thread-3 End Time for Task 3 Fri May 19 00:51:24 IST 2017
Completed all threads
如果仔细观察输出:
pool-1-thread-1 End Time for Task 1 Fri May 19 00:51:05 IST 2017
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:51:15 IST 2017
一旦任务 1 结束,下一个任务会在 scheduleWithFixedDelay 方法中提供的 10 秒延迟后安排。
这就是 Java ScheduledThreadPoolExecutor 示例的全部内容。
相关文章:
相关推荐:
- [其它]第三章java中的抽象类|
- [其它]第四章java中的TreeMap与示例|
- [其它]第四章java中的hashcode()和equals()方法|
- [其它]第六章JavaFutureTask示例|
- [其它]计算机组成原理PDF扫描格式电子版百度云网盘下载
- [其它]程序设计语言概念(第9版)[Robert W. Sebesta]pdf格式电子版百度云网盘下载[53.8M]
- [其它]程序员必读之软件架构[Simon Brown]pdf格式电子版百度云网盘下载[41.6M]
- [其它]程序员的思维修炼 开发认知潜能的九堂课[Andy Hunt]pdf格式电子版百度云网盘下载
- [其它]程序员的职业素养[Robert C. Martin]pdf格式电子版百度云网盘下载[21.6M]
- [其它]程序员教程(第3版)[张淑平]pdf格式电子版百度云网盘下载[136.5M]
- 计算机组成原理PDF扫描格式电子版百度云网盘下载
- 硅谷之谜[吴军]pdf格式电子版百度云网盘下载[59.5M]
- 自选基金助手,一款Chrome扩展程序
- 七周七语言 理解多种编程范型[Bruce A. Tate]pdf格式电子版百度云网盘下载[9M]
- 系统集成项目管理工程师考试考眼分析与样卷解析(2014版)[软考新大纲研究组]
- 程序员面试金典(第5版)[Gayle Laakmann McDowell]pdf格式电子版百度云网盘下载[81.5M]
- 创业维艰 如何完成比难更难的事[Ben Horowitz]pdf格式电子版百度云网盘下载[65.3
- 程序员的思维修炼 开发认知潜能的九堂课[Andy Hunt]pdf格式电子版百度云网盘下载
- 图灵的秘密 他的生平、思想及论文解读[Charles Petzold]pdf格式电子版百度云网盘下
- OCP OCA认证考试指南全册:Oracle Database 11g(1Z0-051、1Z0-052、1Z0-053)[John Watson]pdf格式