scheduledjava executorservicee有哪些方法

java.util.concurrent.ScheduledExecutorService接口是ExecutorService接口的子接口,并支持将来和/或定期执行任务。
ScheduledExecutorService接口的方法
ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit)
创建并执行在给定延迟后启用ScheduledFuture。
ScheduledFuture&?& schedule(Runnable command, long delay, TimeUnit unit)
创建并执行在给定延迟后启用的单次操作。
ScheduledFuture&?& scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
创建并执行在给定的初始延迟之后,随后以给定的时间段首先启用的周期性动作; 那就是执行会在initialDelay之后开始,然后是initialDelay + period,然后是initialDelay + 2 * period,等等。
ScheduledFuture&?& scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
创建并执行在给定的初始延迟之后首先启用的定期动作,随后在一个执行的终止和下一个执行的开始之间给定的延迟。
实例以下TestThread程序显示了基于线程的环境中ScheduledExecutorService接口的使用。
import java.util.concurrent.E
import java.util.concurrent.ScheduledExecutorS
import java.util.concurrent.ScheduledF
import java.util.concurrent.TimeU
public class TestThread {
public static void main(final String[] arguments) throws InterruptedException {
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
final ScheduledFuture&?& beepHandler =
scheduler.scheduleAtFixedRate(new BeepTask(), 2, 2, TimeUnit.SECONDS);
scheduler.schedule(new Runnable() {
public void run() {
beepHandler.cancel(true);
scheduler.shutdown();
}, 10, TimeUnit.SECONDS);
static class BeepTask implements Runnable {
public void run() {
System.out.println(&beep&);
这将产生以下结果 -
加QQ群啦!
JAVA技术群(2000人群):
MySQL/SQL群(2000人群):
Python技术群(2000人群):
大数据开发群(2000人群): (Java,Python,R,Scala,Hadoop,Spark,zookeeper,kafka等技术)
Web开发群(新群):
(PHP,HTML/HTML5,JS/JQuery,CSS等技术)
Linux技术群(新群): (Redhat/Centos,Ubuntu,Shell,运维,监控等技术)
易百教程移动端:请扫描本页面底部(右侧)二维码关注微信公众号,或直接手机访问:
上一篇:下一篇:2015年5月 Java大版内专家分月排行榜第二2013年5月 Java大版内专家分月排行榜第二
2011年5月 Java大版内专家分月排行榜第三2011年1月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。ScheduledExecutorService的使用
ScheduledExecutorService接口
在ExecutorService的基础上,ScheduledExecutorService提供了按时间安排执行任务的功能,它提供的方法主要有:
schedule(task,initDelay):安排所提交的Callable或Runnable任务在initDelay指定的时间后执行。
scheduleAtFixedRate():安排所提交的Runnable任务按指定的间隔重复执行
scheduleWithFixedDelay():安排所提交的Runnable任务在每次执行完后,等待delay所指定的时间后重复执行。
代码:ScheduleExecutorService的例子
java.util.concurrent.C
import java.util.concurrent.ExecutionE
import java.util.concurrent.E
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledF
import java.util.concurrent.TimeU
public class
ScheduledExecutorServiceTest
public static void main(String[] args) throws
InterruptedException,ExecutionException
&&&&&&&&&&&&&
&&&&&&&&&&&&&&
ScheduledExecutorService
service=Executors.newScheduledThreadPool(2);
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
Runnable task1=new Runnable()
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
public void run()
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
System.out.println("Taskrepeating.");
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
final ScheduledFuture
future1=service.scheduleAtFixedRate(task1,0,1,TimeUnit.SECONDS);
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
ScheduledFuture future2=service.schedule(new Callable()
&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
public String call()
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
future1.cancel(true);
&&&&&&&&&&&&&&&&&&&&&&&&&&&
return "taskcancelled!";
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
},10,TimeUnit.SECONDS);
&&&&&&&&&&&&&&
System.out.println(future2.get());
service.shutdown();
这个例子有两个任务,第一个任务每隔一秒打印一句“Taskrepeating”,第二个任务在5秒钟后取消第一个任务。
*1:初始化一个ScheduledExecutorService对象,这个对象的线程池大小为2。
*2:用内函数的方式定义了一个Runnable任务。
*3:调用所定义的ScheduledExecutorService对象来执行任务,任务每秒执行一次。能重复执行的任务一定是
Runnable类型。注意我们可以用TimeUnit来制定时间单位,这也是Java5.0里新的特征,5.0以前的记时单位是微秒,现在可精确到奈秒。
*4:调用ScheduledExecutorService对象来执行第二个任务,第二个任务所作的就是在5秒钟后取消第一个任务。
*5:关闭服务。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。7174人阅读
JAVA(103)
定时任务调度(28)
因为scheduleAtFixedRate是指定频率执行方法,若方法的执行时间大于指定的间隔时间,将会发生,同一时间点 ,执行方法N 次。
所以需要使用同步方法才确保并发操作的安全性。
import java.util.concurrent.E
import java.util.concurrent.ScheduledExecutorS
import java.util.concurrent.S
import java.util.concurrent.TimeU
public class TodoTimer {
static Logger log = SimpleLogger.getLogger(TodoTimer.class);
private TodoTimer() {
* 定时操作线程
private final static Runnable TodoOperation = new Runnable() {
public void run() {
semaphore.acquire();
TodoManager.operate();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
* 同步信号量
private static final Semaphore semaphore = new Semaphore(1);
* 定时执行
private static ScheduledExecutorService scheduler =
* 启动定时器
public static void start() {
if (scheduler == null) {
scheduler = Executors.newScheduledThreadPool(1);
synchronized (scheduler) {
* TODO 设置定时器启动时间和间隔
scheduler.scheduleAtFixedRate(TodoOperation, 20, 60*5, TimeUnit.SECONDS);
log.debug(&启动TODO定时器!&);
log.warn(&TODO定时器正在运行!&);
* 停止定时器
public static void stop() {
synchronized (scheduler) {
if (scheduler != null && !scheduler.isShutdown()) {
scheduler.shutdown();
scheduler =
log.debug(&关闭TODO定时器!&);
* 重启定时器
public static void restart() {
* 手动触发
public static void trigger() {
TodoOperation.run();
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7914458次
积分:67776
积分:67776
排名:第28名
原创:254篇
转载:2719篇
评论:718条
(22)(73)(46)(92)(17)(25)(37)(63)(7)(74)(67)(95)(177)(113)(86)(40)(43)(71)(14)(10)(17)(12)(6)(20)(27)(54)(71)(97)(74)(32)(2)(24)(21)(62)(60)(36)(23)(27)(46)(34)(76)(63)(121)(141)(74)(54)(120)(77)(42)(4)(12)(19)(1)(9)(15)(19)(18)(16)(31)(79)(68)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'

我要回帖

更多关于 executorservice 队列 的文章

 

随机推荐