ScheduledThreadPoolExecutor可以代替timer,timer的缺点是一个timer启动一个线程,如果任务数量很多,会创建很多线程,不推荐使用。

ScheduledThreadPoolExecutor他有个线程池管理线程管理所有任务,效率更高

public class ScheduledThreadPoolExecutorTest {

    public static void main(String[] args) throws InterruptedException {
//
ScheduledThreadPoolExecutor schedulePool = new ScheduledThreadPoolExecutor(); // 周期任务
// 从上一周期的任务的开始时间到当前周期的任务开始时间的间隔
// 任务的执行时间 > period参数:时间间隔是任务的执行时间。
// 任务的执行时间 < period参数:时间间隔是period参数。
ScheduledFuture<?> scheduledFuture = schedulePool.scheduleAtFixedRate(new MyRunnable(), , , TimeUnit.MILLISECONDS); // 取消该任务
Thread.sleep();
scheduledFuture.cancel(true); // 延时任务
// 从上一周期的任务的执行结束时间到当前周期的任务开始时间的间隔,固定延迟时间为delay参数,与任务执行时间无关。
// schedulePool.scheduleWithFixedDelay(new MyRunnable(), 50, 1000, TimeUnit.MILLISECONDS); } static class MyRunnable implements Runnable { int period = ; @Override
public void run() {
//为周期任务捕获异常,避免异常影响下一周期的任务执行
try {
System.out.println("---------------第 " + period + " 周期-------------");
System.out.println("begin = " + System.currentTimeMillis() / );//秒
//任务执行时间
Thread.sleep();
System.out.println("end = " + System.currentTimeMillis() / );
period++;
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} }
} /**
* 计算初始的延迟毫秒数
* @return
*/
public static long getDelayMillis(){
int dayOfHour = ; // 24h 制
int minute = ;
int second = ;
long delay; //首次执行任务的延迟
Calendar c = Calendar.getInstance();
long currentTime = c.getTimeInMillis();
c.set(Calendar.HOUR_OF_DAY, dayOfHour);
c.set(Calendar.MINUTE, minute);
c.set(Calendar.SECOND, second);
long executeTime = c.getTimeInMillis();
delay = executeTime - currentTime < ? (executeTime + * * * - currentTime )
: (executeTime - currentTime);
System.out.println("DelayTimeInMillis =" + delay);
return delay;
}
}

ScheduledThreadPoolExecutor周期任务或延时任务线程池的更多相关文章

  1. ScheduledThreadPoolExecutor源码分析-你知道定时线程池是如何实现延迟执行和周期执行的吗?

    Java版本:8u261. 1 简介 ScheduledThreadPoolExecutor即定时线程池,是用来执行延迟任务或周期性任务的.相比于Timer的单线程,定时线程池在遇到任务抛出异常的时候 ...

  2. Java多线程总结(二)锁、线程池

    掌握Java中的多线程,必须掌握Java中的各种锁,以及了解Java中线程池的运用.关于Java多线程基础总结可以参考我的这篇博文Java多线程总结(一)多线程基础 转载请注明出处——http://w ...

  3. 深入理解Java线程池:ThreadPoolExecutor

    线程池介绍 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理.如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非常多,但每个线 ...

  4. ElasticSearch 线程池类型分析之 ResizableBlockingQueue

    ElasticSearch 线程池类型分析之 ResizableBlockingQueue 在上一篇文章 ElasticSearch 线程池类型分析之 ExecutorScalingQueue的末尾, ...

  5. JUC 一 线程池

    线程 线程,是程序执行的最小单元.线程是进程中的其中一个实体,是被系统独立调度和分派的基本单位 它可与同属一个进程的其它线程共享进程所拥有的全部资源. 一个线程可以创建和撤消另一个线程,同一进程中的多 ...

  6. Java线程池实现原理及其在美团业务中的实践

    本文转载自Java线程池实现原理及其在美团业务中的实践 导语 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供 ...

  7. Java线程池实现原理及其在美团业务中的实践(转)

    转自美团技术团队:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html 随着计算机行业的飞速发展,摩尔定律逐 ...

  8. Java 线程池详细介绍

    根据摩尔定律(Moore’s law),集成电路晶体管的数量差不多每两年就会翻一倍.但是晶体管数量指数级的增长不一定会导致 CPU 性能的指数级增长.处理器制造商花了很多年来提高时钟频率和指令并行.在 ...

  9. ReentrantLock+线程池+同步+线程锁

    1.并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量 ...

随机推荐

  1. Docker制作dotnet core控制台程序镜像

    (1)首先我们到某个目录下,然后在此目录下打开visual studio code. 2.编辑docker file文件如下: 3.使用dotnet new console创建控制台程序; 4.使用d ...

  2. 4.dubbo 的 spi 思想是什么?

    作者:中华石杉 面试题 dubbo 的 spi 思想是什么? 面试官心理分析 继续深入问呗,前面一些基础性的东西问完了,确定你应该都 ok,了解 dubbo 的一些基本东西,那么问个稍微难一点点的问题 ...

  3. centos7 下面显卡驱动安装

    一.安装驱动 屏蔽默认的nouveau cd /lib/modprobe.d/ sudo vim dist-blacklist.conf 将nvidiafb注释掉 #blacklist nvidiaf ...

  4. 第 33课 C++中的字符串(下)

    字符串与数字转换-标准库中提供了相关的类对字符串和数字进行转换-字符串流类(sstream)用于string的转换.<sstream>-相关头文件.istringstream-字符串输入流 ...

  5. 201871010106-丁宣元 《面向对象程序设计(java)》第十六周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第十六周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nw ...

  6. Linux sh、source和.命令执行.sh文件的区别

    sh文件介绍 .sh为Linux的脚本文件,我们可以通过.sh执行一些命令,可以理解为windows的.bat批处理文件. 点命令 .命令和source是同一个命令,可以理解为source的缩写,简称 ...

  7. shell 之while两种写法

    1.while[] #!/bin/dash min= max= while [ $min -le $max ] do echo $min min=`` done 2. while(()) #!/bin ...

  8. BOI 2003 团伙

    洛谷 P1892 [BOI2003]团伙 洛谷传送门 题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋 ...

  9. VIJOS-P1059 积木城堡

    洛谷 P1504 积木城堡 https://www.luogu.org/problem/P1504 JDOJ 1240: VIJOS-P1059 积木城堡 https://neooj.com/oldo ...

  10. itsdangerous模块

    使用场景: 在取消订阅时,可以在URL里序列化并且签名一个用户的ID或在任何的激活账户的链接或类似的情形下使用.这种情况下不需要生成一个一次性的token并把它们存到数据库中. 被签名的对象可以被存入 ...