java 周期任务_Java ScheduledThreadPoolExecutor延迟或周期性执行任务

WorkerThread类package com.cninfo.ThreadTest;

import java.util.Date;

public class WorkerThread implements Runnable{

private String taskname;

public WorkerThread(int i){

this.taskname="第"+i+"个任务";

}

@Override

public void run() {

System.out.println(Thread.currentThread().getName()+" at "+new Date()+ " do "+this.taskname);

processCommand();

System.out.println(Thread.currentThread().getName()+" at "+new Date()+" finished "+this.taskname);

}

private void processCommand() {

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

@Override

public String toString(){

return this.taskname;

}

}

ScheduledThreadPool类package com.cninfo.ThreadTest;

import java.util.Date;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

public class ScheduledThreadPool {

public static void main(String[] args) throws InterruptedException {

//线程池中初始化只放了2个线程去执行任务

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);

//schedule to run after sometime

System.out.println("Current Time = "+new Date());

for(int i=1; i<3; i++){

//Thread.sleep(1000);

WorkerThread worker = new WorkerThread(i);

//线程池中的线程,延迟10秒执行丢到线程池中的任务,线程池中的任务第一次执行完毕,就不在执行

//scheduledThreadPool.schedule(worker, 10, TimeUnit.SECONDS);

///线程池中的线程,延迟10秒周期性执行丢到线程池中的任务,当线程池中的线程把池中的所有任务执行完毕,相对于第一次执行的时间的固定的周期(如果超过则马上执行),线程又开始重新执行线程池中的任务

//scheduledThreadPool.scheduleAtFixedRate(worker, 10, 60,TimeUnit.SECONDS);

//scheduledThreadPool.scheduleAtFixedRate(worker, 10, 3,TimeUnit.SECONDS);

//线程池中的线程,延迟10秒周期性执行丢到线程池中的任务,当线程池中的线程把池中的所有任务执行完毕,相对于此刻时间间隔固定的周期,线程又开始重新执行线程池中的任务

//scheduledThreadPool.scheduleWithFixedDelay(worker, 10, 60, TimeUnit.SECONDS);

scheduledThreadPool.scheduleWithFixedDelay(worker, 10, 3, TimeUnit.SECONDS);

}

System.out.println("所有的任务都丢到了线程池中");

//add some delay to let some threads spawn by scheduler

//Thread.sleep(30000);

//scheduledThreadPool.shutdown();

/*  while(!scheduledThreadPool.isTerminated()){

//wait for all tasks to finish

}*/

System.out.println("Finished all threads");

}

}

schedule:

创建并执行在给定延迟后启用的一次性操作。

scheduleWithFixedDelay :

官方意思是:创建一个给定初始延迟的间隔性的任务,之后的下次执行时间是上一次任务从执行到结束所需要的时间+给定的间隔时间。举个例子:比如我给定任务的初始延迟(long initialdelay)是12:00, 间隔为1分钟 。 那么这个任务会在12:00 首次创建并执行,如果该任务从执行到结束所需要消耗的时间为1分钟,那么下次任务执行的时间理应从12:01 再加上设定的间隔1分钟,那么下次任务执行时间是12:02 。这里的间隔时间(delay) 是从上次任务执行结束开始算起的。如果执行要花费比其周期更长的时间,则下个任务等这次任务结束后,继续等待间隔时间(delay)之后,然后才执行

scheduleAtFixedRate :

官方文档意思为:创建一个给定初始延迟的间隔性的任务,之后的每次任务执行时间为 初始延迟 + N * delay(间隔)  。这里的N为首次任务执行之后的第N个任务,N从1开始,意识就是 首次执行任务的时间为12:00 那么下次任务的执行时间是固定的 是12:01 下下次为12:02。与scheduleWithFixedDelay 最大的区别就是 ,scheduleAtFixedRate  不受任务执行时间的影响。这里的间隔时间指的是间隔间隔固定的时间,如果任务的任何一个执行遇到异常,则后续执行都会被取消。否则,只能通过执行程序的取消或终止方法来终止该任务。如果此任务的任何一个执行要花费比其周期更长的时间,则将推迟后续执行,但不会同时执行。如果执行要花费比其周期更长的时间,则下个任务等这次任务结束后,马上执行

一般来说,线程池中的线程数不是越多越好,要根据机器的性能来设置,其次,放入线程池中的任务数最好小于等于线程池中的线程数目。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值