博客
关于我
线程池-----ScheduledExecutorService实现定时任务
阅读量:339 次
发布时间:2019-03-04

本文共 2831 字,大约阅读时间需要 9 分钟。

接口scheduleAtFixedRate原型定义及参数说明:

public ScheduledFuture
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);

command:执行线程;

initialDelay:初始化延时;
period:两次开始执行最小间隔时间;
unit:计时单位;

1、使用scheduleAtFixedRate()方法实现周期性执行

如:每隔100毫秒,执行一次run任务,得到执行后的打印::

import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class ScheduledExecutorServiceTest {       public static void main(String[] args) {           ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();        executorService.scheduleAtFixedRate(new Runnable() {               @Override            public void run() {                   System.out.println("run "+ System.currentTimeMillis());            }        }, 0, 100, TimeUnit.MILLISECONDS);    }

2、使用scheduleAtFixedRate()方法实现周期性定时任务

有时候我们希望一个任务被安排在凌晨3点(访问较少时)周期性的执行一个比较耗费资源的任务,可以使用下面方法设定每天在固定时间执行一次任务。

import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;@Componentpublic class ExecutorTest {       public static final ScheduledExecutorService service = Executors.newScheduledThreadPool(4);    public static void main(String[] args) {           long oneDay = 24 * 60 * 60 * 1000;        long initDelay  = getTimeMillis("03:00:00") - System.currentTimeMillis();        initDelay = initDelay > 0 ? initDelay : oneDay + initDelay;        service.scheduleAtFixedRate(new MyScheduled1(),initDelay,oneDay, TimeUnit.MILLISECONDS);        service.scheduleAtFixedRate(new MyScheduled2(),initDelay,oneDay,TimeUnit.MILLISECONDS);    }/** * 获取指定时间对应的毫秒数 * @param time "HH:mm:ss" * @return */private static long getTimeMillis(String time) {   	try {   		DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");		DateFormat dayFormat = new SimpleDateFormat("yy-MM-dd");		Date curDate = dateFormat.parse(dayFormat.format(new Date()) + " " + time);		return curDate.getTime();	} catch (ParseException e) {   		e.printStackTrace();	}	return 0;

自定义线程:

public class MyScheduled1 implements Runnable{       @Override    public void run() {           System.out.println("my scheduled 01-----");    }}public class MyScheduled2 implements Runnable {       @Override    public void run() {           System.out.println("my scheduled 02 ------");    }}

注意与另一个接口的区别:

接口scheduleWithFixedDelay原型定义及参数说明

public ScheduledFuture
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit);

command:执行线程

initialDelay:初始化延时
period:前一次执行结束到下一次执行开始的间隔时间(间隔执行延迟时间)
unit:计时单位

由此可见,ScheduleAtFixedRate 是基于固定时间间隔进行任务调度,ScheduleWithFixedDelay 取决于每次任务执行的时间长短,是基于不固定时间间隔进行任务调度

转载地址:http://xybe.baihongyu.com/

你可能感兴趣的文章
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>
MySQL 用 limit 为什么会影响性能?
查看>>