Java中定时任务Timer工具类提供了计划任务的实现,但是Timer工具类是以队列的方式来管理线程的,并不是以线程池的方式,这样在高并发的情况下,运行效率会有点低。
ScheduleExecutorService 主要作用是将定时任务与线程池结合使用。
ScheduleExecutorService 的父接口是Executor,父类是ThreadPoolExecutor。
看个例子
final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
List<Future<String>> futureList = new ArrayList<Future<String>>(); // 此线程池运行5个线程
for (int i = 0; i < 5; i++) {
final int index = i;
System.out.println("Thread-" + index + "-add-" + sf.format(new Date()));
Future<String> future = executor.schedule(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("Thread-" + index + "-begin-" + sf.format(new Date()));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread-" + index + "-end-" + sf.format(new Date()));
return "index-" + index;
} }, 4L, TimeUnit.SECONDS); // 延迟4秒后执行
futureList.add(future);
System.out.println("Thread-" + index + "-add over-" + sf.format(new Date()));
} // future.get() 是阻塞执行的,所以获取值要在线程都启动之后,再获取
for (Future<String> future : futureList) {
try {
System.out.println(future.get()); // 获取线程返回值
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
使用工厂类产生ScheduleExecutorService有两个api:Executors.newScheduledThreadPool( int ) 和 Executors.newSingleThreadScheduledExecutor() 。
ScheduleExecutorService 可以运行Callable,也可以运行Runnable,常用api如下:
execute(Runnable command) 直接执行,执
行命令所需的延迟为零
getQueue() 返回
BlockingQueue<Runnable> 返回此执行器使用的任务队列
schedule(Callable<V> callable, long delay, TimeUnit unit) 创建并执行给定延迟后启用的计划任务
schedule(Runnable command, long delay, TimeUnit unit) 创建并执行给定延迟后启用的计划任务
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 创建并执行一个周期性操作,该操作首先在给定的初始延迟之后启用,然后以给定的周期启用
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) 创建并执行周期性动作,主要左右那个是设置多个任务之间固定的运行时间间隔。
shutdown() 启动一个有序的关闭,其中先前提交的任务被执行,但是没有新任务被接受
shutdownNow() 尝试停止所有积极执行任务,停止等待任务的处理,并返回等待执行的任务的列表
submit(Callable<T> task) 提交一个返回值的任务用于执行
submit(Runnable task) 提交可执行任务以执行
submit(Runnable task, T result) 提交可执行任务以执行
【Java并发核心七】计划任务ScheduleExecutorService的更多相关文章
-
【Java并发核心三】CountDownLatch、CyclicBarrier及Phaser
个人感觉,看书学习还是需要“不求甚解”,因为一旦太过于计较小的得失,就容易钻牛角尖,学习进度也慢.我们完全可以先学一个大概,等到真正用到的时候再把那些细节丰富起来,就更有针对性. 所以,针对java并 ...
-
【java并发核心一】Semaphore 的使用思路
最近在看一本书<Java并发编程 核心方法与框架>,打算一边学习一边把学习的经验记下来,所粘贴的代码都是我运行过的,大家一起学习,欢迎吐槽. 估计也没多少人看我的博客,哈哈,那么我还是会记 ...
-
Java并发(七):双重检验锁定DCL
双重检查锁定(Double Check Lock,DCL) 1.懒汉式单例模式,无法保证线程安全: public class Singleton { private static Singleton ...
-
【Java并发核心九】并发集合框架
1.List接口:ArrayList 和 Vector ArrayList不是线程安全的,Vector是线程安全的,Vector有一个子类,可实现后进先出(LIFO)的对象堆栈(LinkedList ...
-
java并发系列(七)-----ConcurrentHashMap原理分析(JDK1.8)
JDK1.8的实现已经摒弃了Segment的概念,而是直接用Node数组+链表+红黑树的数据结构来实现,并发控制使用Synchronized和CAS来操作,整个看起来就像是优化过且线程安全的HashM ...
-
Java并发编程 (七) J.U.C之AQS
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一. J.U.C之AQS-介绍 1.定义: AbstractQueuedSynchronizer简称AQ ...
-
【java并发核心八】Fork-Join分治编程
jdk1.7中提供了Fork/Join并行执行任务框架,主要作用就是把大任务分割成若干个小任务,再对每个小任务得到的结果进行汇总. 正常情况下,一些小任务我们可以使用单线程递归来实现,但是如果要想充分 ...
-
【Java并发核心四】Executor 与 ThreadPoolExecutor
Executor 和 ThreadPoolExecutor 实现的是线程池,主要作用是支持高并发的访问处理. Executor 是一个接口,与线程池有关的大部分类都实现了此接口. ExecutorSe ...
-
【java并发核心二】Exchanger的使用
类 Exchanger 的功能可以使2个线程之间传输数据,比生产者/消费者模式方便. Exchanger类的结构很简单,重点就是exchange()方法. exchange()方法是阻塞执行的,可以设 ...
随机推荐
-
【强烈推荐】数据库迁移利器:Migrator.Net
简介 很郁闷,写了一天的遇到LiveWriter错误,可恶啊 几年前在做项目中第一次接触到了Migrator.Net,就深深被吸引住了,至此以后在新的大项目中,我都会使用Migrator.Net来创建 ...
-
AJAX大文件切割上传以及带进度条。
分块传输的原理就是利用HTML5新增的文件slice截取函数. 代码如下: html: <input id="f" type="file" name=&q ...
-
MYSQL中&#39;TYPE=MyISAM&#39;错误的解决方案
create 语句后面的TYPE=MyISAM TYPE=MyISAM 和 ENGINE=MyISAM 都是设置数据库存储引擎的语句 ,(老版本的MySQL使用TYPE而不是ENGINE(例如,TYP ...
-
HDU-4747 Mex(线段树区间更新)
题目大意:给一个长度为n的整数序列,定义mex(i,j)表示区间[i,j]中没有出现过的最小非负整数,求sigma(mex(i,j)),即序列中所有连续非空子区间的mex之和. 题目分析: answe ...
-
opencv矩阵总结
OpenCV 矩阵操作 CvMat 转自:http://hi.baidu.com/xiaoduo170/blog/item/10fe5e3f0fd252e455e72380.html 每回用矩阵都要查 ...
-
virtual box 改变已经创建的虚拟系统分配的硬盘
启动cmd,进入virtualbox安装的目录 :cd E:\Program Files\Oracle\VirtualBox 然后输入VBoxManage.exe list hdds ,可以看到 D: ...
-
ubuntu环境下lnmp环境搭建(3)之Php
1.lnmp详细 http://www.discuz.net/thread-3513107-1-1.html 2. 到php目录 http://blog.aboutc.net/linux/65/co ...
-
simpledet 的配置
simpledet 的配置 1. 通过 docker 配置 simpledet 1.1 系统要求 ubuntu16.04 python >=3.5 1.2 下载 docker 镜像 匹配的版本为 ...
-
Java8-Optional与null
对null进行处理 程序中经常需要对null情况进行处理,比如Course类中有一个List stuList属性,Student有一个name属性. 现在想要查看某个student的name属性的长度 ...
-
切换Fragment时实现数据保持
摘要 Fragment设计初衷是为了简化不同屏幕分辨率的开发难度,他将代表一个功能的UI及其相关数据看做一个模块,以便达到复用.可以将Fragment看作是一个可以嵌入布局中的activity,有自己 ...