创建定时任务线程池的方式

ScheduledExecutorService executorService = Executors.newScheduledThreadPool(4);// 不推荐
// 或
ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(4);// 推荐

创建定时任务的方法

public interface ScheduledExecutorService extends ExecutorService {

    /**
* 延迟delay(时间单位由unit指定)后执行任务
*
* @param command 任务
* @param delay 延迟时间
* @param unit 时间单位
* @return 执行结果
*/
public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit); /**
* 延迟delay(时间单位由unit指定)时间后执行任务
* 任务执行完毕后,返回执行结果
*
* @param callable 任务
* @param delay 延迟时间
* @param unit 时间单位
* @return 执行结果
*/
public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit); /**
* 延迟delay时间后执行第一次任务,之后每过period毫秒执行一次。
* 假设:
* 执行一次任务需要消耗的时间为 exeTime
* 执行此次任务的开始时间是 nowTime
* 执行下一次任务的实际时间是 actuallyTime
* 如果 exeTime >= period ,那么,actuallyTime >= nowTime + exeTime;
* 如果 exeTime < period , 那么,actuallyTime >= nowTime + period;
*
* @param command 任务
* @param initialDelay 执行首次任务之前的延时时间
* @param period 周期性执行任务,相邻两次的时间间隔
* @param unit 时间单位
* @return 执行结果
*/
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit); /**
* 延迟initialDelay时间后执行首次任务,之后的任务执行,全部在上次任务执行完毕之后,再延迟delay时间执行。
*
* 假设:
* 执行一次任务需要消耗的时间为 exeTime
* 执行此次任务的开始时间是 nowTime
* 执行下一次任务的实际时间是 actuallyTime
* 如果 exeTime >= period ,那么,actuallyTime >= nowTime + exeTime + delay;
* 如果 exeTime < period , 那么,actuallyTime >= nowTime + exeTime + period;
*
* @param command    任务
* @param initialDelay 执行首次任务之前的延迟时间
* @param delay     每次任务执行完成后,执行下次任务之前的延迟时间
* @param unit      时间单位
* @return
*/
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit); }

创建定时任务的示例

示例一:延迟执行

package com.java.scheduled.task.pool;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit; public class ScheduledTaskDemo01 { public static void main(String[] args) {
ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(4);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
System.out.println("安排执行任务的时间:"+sdf.format(date));
long c1 = date.getTime();
Runnable runnable = () -> {
Date nowDate = new Date();
System.out.println("****计划任务(1):【延迟2秒执行】");
System.out.println("实际执行任务的时间:"+sdf.format(nowDate));
System.out.println("延迟时间:"+(nowDate.getTime() - c1)+"ms");
};
executorService.schedule(runnable, 2, TimeUnit.SECONDS);
} }

执行结果如下:

安排执行任务的时间:2019-05-28 12:10:46
****计划任务(1):【延迟2秒执行】
实际执行任务的时间:2019-05-28 12:10:48
延迟时间:2087ms

示例二:延迟执行,返回结果

package com.java.scheduled.task.pool;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.*; public class ScheduledTaskDemo02 { public static void main(String[] args) {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(4);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
System.out.println("安排执行任务的时间:"+sdf.format(date));
long c2 = date.getTime();
Callable<String> callable = () -> {
Date nowDate = new Date();
System.out.println("****计划任务(2):【延迟2秒执行,执行结束返回结果】");
System.out.println("实际执行任务的时间:"+sdf.format(nowDate));
System.out.println("延迟时间:"+(nowDate.getTime() - c2)+"ms");
Thread.sleep(1000);
System.out.println("任务执行完毕,当前时间:"+sdf.format(new Date()));
return "success";
};
ScheduledFuture<String> scheduledFuture = executorService.schedule(callable, 2, TimeUnit.SECONDS);
try {
System.out.println("任务的执行结果:"+scheduledFuture.get());
} catch (ExecutionException e1) {
e1.printStackTrace();
} catch (InterruptedException e2) {
e2.printStackTrace();
}
} }

执行结果如下:

安排执行任务的时间:2019-05-28 12:14:05
****计划任务(2):【延迟2秒执行,执行结束返回结果】
实际执行任务的时间:2019-05-28 12:14:07
延迟时间:2072ms
任务执行完毕,当前时间:2019-05-28 12:14:08
任务的执行结果:success

示例三:延迟+周期性执行任务

package com.java.scheduled.task.pool;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; public class ScheduledTaskDemo03 { public static void main(String[] args) {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(4);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
System.out.println("安排执行任务的时间:"+sdf.format(date));
long c3 = date.getTime();
Runnable runnable = new Runnable() {
long exeTime = c3;
@Override
public void run() {
Date nowDate = new Date();
System.out.println("--------------------------------------------------------------------------------");
System.out.println("计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】");
System.out.println("****实际执行任务的时间:"+sdf.format(nowDate));
System.out.println("****距离上次执行任务的时间间隔:"+(nowDate.getTime() - exeTime)+"ms");
try {
Thread.sleep(4000);
} catch (InterruptedException e) {}
exeTime = nowDate.getTime();
}
};
executorService.scheduleAtFixedRate(runnable, 1, 2, TimeUnit.SECONDS);
} }

执行结果如下:

安排执行任务的时间:2019-05-28 12:15:12
--------------------------------------------------------------------------------
计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
****实际执行任务的时间:2019-05-28 12:15:13
****距离上次执行任务的时间间隔:1003ms
--------------------------------------------------------------------------------
计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
****实际执行任务的时间:2019-05-28 12:15:17
****距离上次执行任务的时间间隔:4002ms
--------------------------------------------------------------------------------
计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
****实际执行任务的时间:2019-05-28 12:15:21
****距离上次执行任务的时间间隔:4001ms
--------------------------------------------------------------------------------
计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
****实际执行任务的时间:2019-05-28 12:15:25
****距离上次执行任务的时间间隔:4002ms

示例四:初始延迟+周期性延迟执行任务

package com.java.scheduled.task.pool;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; public class ScheduledTaskDemo04 { public static void main(String[] args) {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(4);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
System.out.println("安排执行任务的时间:"+sdf.format(date));
long c3 = date.getTime();
Runnable runnable = new Runnable() {
long exeTime = c3;
@Override
public void run() {
Date nowDate = new Date();
System.out.println("--------------------------------------------------------------------------------");
System.out.println("计划任务(4):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】");
System.out.println("****实际执行任务的时间:"+sdf.format(nowDate));
System.out.println("****距离上次执行任务的时间间隔:"+(nowDate.getTime() - exeTime)+"ms");
try {
Thread.sleep(2500);
} catch (InterruptedException e) {}
exeTime = nowDate.getTime();
}
};
executorService.scheduleWithFixedDelay(runnable, 1, 2, TimeUnit.SECONDS);
} }

执行结果如下:

安排执行任务的时间:2019-05-28 12:16:56
--------------------------------------------------------------------------------
计划任务(4):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
****实际执行任务的时间:2019-05-28 12:16:57
****距离上次执行任务的时间间隔:1018ms
--------------------------------------------------------------------------------
计划任务(4):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
****实际执行任务的时间:2019-05-28 12:17:01
****距离上次执行任务的时间间隔:4504ms
--------------------------------------------------------------------------------
计划任务(4):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
****实际执行任务的时间:2019-05-28 12:17:06
****距离上次执行任务的时间间隔:4502ms
--------------------------------------------------------------------------------
计划任务(4):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
****实际执行任务的时间:2019-05-28 12:17:10
****距离上次执行任务的时间间隔:4502ms

定时任务-ScheduledExecutorService的更多相关文章

  1. <线程池-定时任务> ScheduledExecutorService之shutdown引发的RejectedExecutionException问题

    一. 问题描述 先来看一下异常信息,启动tomcat时就报错: 2015-3-20 15:22:39 org.apache.catalina.core.StandardContext listener ...

  2. java 多线程:线程池的使用Executors~ExecutorService; newCachedThreadPool;newFixedThreadPool(int threadNum);ScheduledExecutorService

    1,为什么要使用线程池:Executors 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互.在这种情形下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更 ...

  3. Android解析XML文件

    XML文件和获取XML值 XML文件样例 <?xml version="1.0" encoding="utf-8"?> <citys> ...

  4. eureka client服务续约源码分析

    必备知识: 1.定时任务 ScheduledExecutorService public class demo { public static void main(String[] args){ Sc ...

  5. 日记整理---->2016-11-21

    2016-11-21简单的总结一下学到的知识点.作为一个目标而存在的东西,总是那么美丽而优雅. 一.PE中事务的编写 getTransactionTemplate().execute(new Tran ...

  6. java定时任务接口ScheduledExecutorService

    一.ScheduledExecutorService 设计思想 ScheduledExecutorService,是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说 ...

  7. java定时任务Timer与ScheduledExecutorService<转>

    在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现.下面LZ就其原理.实例以及Timer缺陷三个方面来解析java Timer定时器. ...

  8. spring boot.定时任务问题记录(TaskScheduler/ScheduledExecutorService异常)

    一.背景 spring boot的定时任务非常简单,只需要在启动类中加上@EnableScheduling注解,然后在对应的方法上配置@Scheduled就可以了,系统会自动处理并按照Schedule ...

  9. Executors框架之ScheduledExecutorService实现定时任务

    一.简介 An ExecutorService that can schedule commands to run after a given delay, or to execute periodi ...

随机推荐

  1. 关于“C++语言程序设计”书的一个类

    class book{    char* title;    int num_pages;    int cur_page;public:    book(const char* theTitle, ...

  2. C语言之fileno()函数--获取已经打开的文件的文件描述符(小技巧)

    open函数相关的:  /* open 是系统调用 返回的是文件句柄*/ #include <sys/stat.h> #include <fcntl.h> int open(c ...

  3. 4-1eclipse & 4-2在eclipse下开发Java

    ecplise是一款继承的开发工具,可以开发我们的java程序. 下载地址: https://www.eclipse.org/downloads/ 视频中ecplise的版本 安装Ecplise: 默 ...

  4. ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 26. 缓存

    In-Memory 使用IMemeryCache接口 注册缓存 HomeController注入进来 建一个类,用来存缓存的常量 判断缓存里面是否有数据,如果没有就读数据库存起来. 设置缓存事件,可调 ...

  5. PHP中正则表达式学习及应用(四)

    正则表达式在PHP中的应用 1.匹配功能 2.替换功能 3.分割功能 例如: <?php $str="addsds{title}hfksjd{author}hfjdkjd{conn}j ...

  6. Java读入优化

    之前被软院校赛卡了一波T,很亏啊.以下抄袭自Codeforces的神仙Petr. 可能得系统研究Java怎么写了?缺点是不能使用hasNext(),可能需要在main()中解决. import jav ...

  7. 201621123016 《Java程序设计》第十周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现 ...

  8. codeforces743D 【DFS】

    题意: 给你一棵以1为root的根,然后让你求两棵不相交子树的最大和: 思路: DFS,主要就是你一定得使两棵子树不相交: 对于一个顶点u,维护以u为根的最大子树和. ①:包含u,即所有的结点和. ② ...

  9. lightoj 1034【强连通+缩点】

    思路: 缩点,计算入度为0点的个数即可: #include<bits/stdc++.h> using namespace std; typedef long long LL; const ...

  10. nil 与 release

    nil就是把一个对象的指针置为空,只是切断了指针与内存中对象的联系:而release才是真正通知内存释放这个对象. 如果没有release就直接nil,那么虽然不会出错,却等于自己制造内存泄漏了,因为 ...