ScheduledTheadPool线程池的特点在于可以延迟执行任务,也可以周期性执行任务。

创建线程池

  1. ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(5);//参数为核心线程数,最大线程数无限大

定义一个简单的任务

  1. class Work implements Runnable {
  2. @Override
  3. public void run() {
  4. System.out.println(Thread.currentThread().getName() + " start time : "+new Date());
  5. try {
  6. Thread.sleep(5000);
  7. } catch (InterruptedException e) {
  8. e.printStackTrace();
  9. }
  10. System.out.println(Thread.currentThread().getName() + "end time : " + new Date());
  11. }
  12. }

执行任务的几种方法:

1、立即执行某任务

  1. System.out.println("current time : "+new Date());
  2. for (int i = 0; i < 2; i++) {
  3. scheduled.execute(new Work());//待执行任务
  4. }

输出结果:

  1. current time : Mon Feb 26 11:31:14 CST 2018
  2. pool-1-thread-2 start time : Mon Feb 26 11:31:14 CST 2018
  3. pool-1-thread-1 start time : Mon Feb 26 11:31:14 CST 2018
  4. pool-1-thread-1end time : Mon Feb 26 11:31:19 CST 2018
  5. pool-1-thread-2end time : Mon Feb 26 11:31:19 CST 2018

结果分析:

程序先打印当前时间:'11:31:14',然后进行for循环,添加两个任务进入线程池,添加方式为立即执行,因此任务各自首先打印开始时间为'11:31:14',与最开始的当前时间相同。然后各自休眠5秒,再次打印时间'11:31:19'。

2、延迟执行

  1. System.out.println("current time : "+new Date());
  2. for (int i = 0; i < 2; i++) {
  3. scheduled.schedule(new Work(), 3, TimeUnit.SECONDS);//待执行任务,延迟时间,延迟时间单位
  4. }

输出结果

  1. current time : Mon Feb 26 11:34:56 CST 2018
  2. pool-1-thread-1 start time : Mon Feb 26 11:34:59 CST 2018
  3. pool-1-thread-2 start time : Mon Feb 26 11:34:59 CST 2018
  4. pool-1-thread-1end time : Mon Feb 26 11:35:04 CST 2018
  5. pool-1-thread-2end time : Mon Feb 26 11:35:04 CST 2018

结果分析:

程序打印当前时间:'11:34:56',然后进行for循环,添加两个任务进线程池,添加方式为延迟执行,延迟时间为3秒。因此两个任务的开始时间均为'11:34:59',然后执行任务需要5秒,最后打印任务完成时间'11:35:04'。

3、延迟且周期性执行(周期时间从线程开始执行计算)

  1. System.out.println("current time : "+new Date());
  2. for (int i = 0; i < 2; i++) {
  3. scheduled.scheduleAtFixedRate(new Work(), 3, 10, TimeUnit.SECONDS);//待执行时间,延迟时间,执行周期,时间单位
  4. }

输出结果

  1. current time : Mon Feb 26 11:48:51 CST 2018
  2. pool-1-thread-1 start time : Mon Feb 26 11:48:54 CST 2018
  3. pool-1-thread-2 start time : Mon Feb 26 11:48:54 CST 2018
  4. pool-1-thread-1end time : Mon Feb 26 11:48:59 CST 2018
  5. pool-1-thread-2end time : Mon Feb 26 11:48:59 CST 2018
  6. pool-1-thread-1 start time : Mon Feb 26 11:49:04 CST 2018
  7. pool-1-thread-2 start time : Mon Feb 26 11:49:04 CST 2018
  8. pool-1-thread-2end time : Mon Feb 26 11:49:09 CST 2018
  9. pool-1-thread-1end time : Mon Feb 26 11:49:09 CST 2018
  10. pool-1-thread-4 start time : Mon Feb 26 11:49:14 CST 2018
  11. pool-1-thread-3 start time : Mon Feb 26 11:49:14 CST 2018
  12. pool-1-thread-4end time : Mon Feb 26 11:49:19 CST 2018
  13. pool-1-thread-3end time : Mon Feb 26 11:49:19 CST 2018

结果分析:

程序打印当前时间:'11:48:51',然后进行for循环,添加两个任务进线程池,添加方式为延迟且周期性执行,延迟时间为3秒,周期时间为10秒。因此两个任务的第一次开始时间均为'11:48:54',然后执行任务需要5秒,打印第一次任务完成时间'11:48:59'。同时周期时间为任务的开始时间,即从'11:48:54'开始计算,到'11:49:04'开始第二次周期执行,因此第二次打印任务开始时间即为'11:49:04'。以此类推。

如果周期时间小于线程的执行时间,即线程已到第二个执行周期,但第一次任务仍未执行完成,则会进行等待,直到第一次任务完成,然后立即执行第二次任务。

4、延迟且周期性执行(周期时间从线程执行完成计算)

  1. System.out.println("current time : "+new Date());
  2. for (int i = 0; i < 2; i++) {
  3. scheduled.scheduleWithFixedDelay(new Work(), 3, 10, TimeUnit.SECONDS);//待执行时间,延迟时间,执行周期,时间单位
  1. }

输出结果

  1. current time : Mon Feb 26 12:00:55 CST 2018
  2. pool-1-thread-1 start time : Mon Feb 26 12:00:58 CST 2018
  3. pool-1-thread-2 start time : Mon Feb 26 12:00:58 CST 2018
  4. pool-1-thread-2end time : Mon Feb 26 12:01:03 CST 2018
  5. pool-1-thread-1end time : Mon Feb 26 12:01:03 CST 2018
  6. pool-1-thread-1 start time : Mon Feb 26 12:01:13 CST 2018
  7. pool-1-thread-2 start time : Mon Feb 26 12:01:13 CST 2018
  8. pool-1-thread-2end time : Mon Feb 26 12:01:18 CST 2018
  9. pool-1-thread-1end time : Mon Feb 26 12:01:18 CST 2018

结果分析:

程序打印当前时间:'12:00:55',然后进行for循环,添加两个任务进线程池,添加方式为延迟且周期性执行,延迟时间为3秒,周期时间为10秒。因此两个任务的第一次开始时间均为'12:00:58',然后执行任务需要5秒,打印第一次任务完成时间'12:01:03'。同时周期时间的开始为任务执行完成时间,即从'12:01:03'开始计算,到'12:01:13'开始第二次周期执行,因此第二次打印任务开始时间即为'12:01:13'。以此类推。

ScheduledTheadPool线程池的使用的更多相关文章

  1. ThreadPoolExecutor线程池

    为什么使用线程池: 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率. 2.线程并发数量过多,抢占系统资源从而导致阻塞. 3.对线程进行一些简单的管理. 在java ...

  2. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  3. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

  4. C#多线程之线程池篇2

    在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...

  5. C#多线程之线程池篇1

    在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...

  6. NGINX引入线程池 性能提升9倍

    1. 引言 正如我们所知,NGINX采用了异步.事件驱动的方法来处理连接.这种处理方式无需(像使用传统架构的服务器一样)为每个请求创建额外的专用进程或者线程,而是在一个工作进程中处理多个连接和请求.为 ...

  7. Java线程池解析

    Java的一大优势是能完成多线程任务,对线程的封装和调度非常好,那么它又是如何实现的呢? jdk的包下和线程相关类的类图. 从上面可以看出Java的线程池主的实现类主要有两个类ThreadPoolEx ...

  8. Android线程管理之ExecutorService线程池

    前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...

  9. Android线程管理之ThreadPoolExecutor自定义线程池

    前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...

随机推荐

  1. opencv-resize()放缩函数简介

    主要介绍函数resize(); 图像缩放的效果图如下: 主程序代码及函数解释如下所示: /******************************************************* ...

  2. 如何使用js判断当前页面是pc还是移动端打开的

    1.利用了正则表达式和三目运算符,含义就是如果是移动端打开的话那就跳转到 "https:www.baidu.com/" ,如果不是就跳转到"http://new.baid ...

  3. 011-Server服务器对象属性

    Transfer:第一个页面直接调用第二个页面,执行完第二个页面后不再返回第一个页面,立即响应到客户端浏览器.Execute:第一个页面直接调用第二个页面,执行完第二个页面后再返回第一个页面执行,最后 ...

  4. beego 初体验 - 环境搭建

    首先,安装go运行时和beego beego,在git bash 运行命令: go get github.com/beego/bee go get github.com/astaxie/beego g ...

  5. opencv的安装及填坑

    opencv的配置方式: https://blog.csdn.net/cocoaqin/article/details/78163171 输入Python时候报错: ERROR: ld.so: obj ...

  6. <6>Lua元表和冒号 self

    Lua中没有像C.C++.JAVA中的类概念,面向对象等 ,但我们可以模拟出来 1. Lua中有个很重要的概念元表 设置元表setmetatable()函数  获取元表getmetatable()函数 ...

  7. linux基本格式和常用目录命令一

    1: cd 绝对路径 2: cd 相对路径 名字开头 ./开头 ../开头 3: cd ~: 去到当前用户所在目录; 4: pwd获取当前的路径的绝对路径; 5: ls 与ls -l 6: cat 操 ...

  8. Sitecore 9有什么新功能

    在这个新版本中有很多值得爱的东西.每个人都会有自己喜欢的新功能,但是,我想与你分享一些地雷: xConnect 正如我们在Sitecore的官方Sitecore 9新闻稿中所见的那样,“新的xConn ...

  9. [openjudge-搜索]广度优先搜索之鸣人和佐助

    题目描述 描述 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸 ...

  10. .py文件 改成默认用idle打开

    A.右键.py文件,edit with idle ==================================B.如果没有这个选项: 选择打开方式,进入python安装路径,选择 Python ...