1.schedule
schedule(Runnable command, long delay, TimeUnit unit),schedule方法被用来延迟指定时间后执行某个指定任务。
public class Job implements Runnable {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("do something at:" + sdf.format(new Date()));
}
}
public class ScheduledExecutorServiceTest {
public static void main(String[] args) {
ScheduledExecutorService schedule = Executors.newScheduledThreadPool(5);
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(" begin to do something at:" + sdf.format(new Date()));
schedule.schedule(new Job(),1, TimeUnit.SECONDS);
}
}
输出如下:
begin to do something at:2012-08-03 09:31:36
do something at:2012-08-03 09:31:42
2.scheduleWithFixedDelay
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay,TimeUnit unit)
scheduleWithFixedDelay():安排所提交的Runnable任务在每次执行完后,等待delay所指定的时间后重复执行
创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟,如果任务的执行时间超过了廷迟时间(delay),下一个任务则会在
(当前任务执行所需时间+delay)后执行。
public class ScheduledExecutorServiceTest {
public static void main(String[] args) {
ScheduledExecutorService schedule = Executors.newScheduledThreadPool(5);
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(" begin to do something at:" + sdf.format(new Date()));
schedule.scheduleWithFixedDelay(new Job(), 1, 2, TimeUnit.SECONDS);
}
}
输出如下:
begin to do something at:2012-08-03 09:36:53
do something at:2012-08-03 09:36:59
do something at:2012-08-03 09:37:06
do something at:2012-08-03 09:37:13
3.scheduleAtFixedRate
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnitunit)
scheduleAtFixedRate():安排所提交的Runnable任务按指定的间隔重复执行
创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。
如果任务的执行时间小于period,将会按上述规律执行。否则,则会按 任务的实际执行时间进行周期执行。
public class ScheduledExecutorServiceTest {
public static void main(String[] args) {
ScheduledExecutorService schedule = Executors.newScheduledThreadPool(2);
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(" begin to do something at:" + sdf.format(new Date()));
schedule.scheduleAtFixedRate(new Job(), 1,2, TimeUnit.SECONDS);
}
结果输出:
begin to do something at:2012-08-04 08:53:30
do something at:2012-08-04 08:53:36
do something at:2012-08-04 08:53:41
do something at:2012-08-04 08:53:46
do something at:2012-08-04 08:53:51
Demo:
int a = 0;
int b = 0;
ScheduledExecutorService mExecutorService;
ScheduledFuture mFuture1, mFuture2;
private void executScheduledExecutorService() {
mExecutorService = Executors.newScheduledThreadPool(1);
mFuture1 = mExecutorService.scheduleAtFixedRate(new EchoServer(), 1000, 1000, TimeUnit.MILLISECONDS);
mExecutorService.schedule(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Log.i("W", "shut down.");
mExecutorService.shutdownNow();
}
}, 40, TimeUnit.SECONDS);
}
class EchoServer implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
a++;
Log.i("W", "a = " + a);
if (a == 10) {
mFuture1.cancel(false);
}
if (a == 2) {
mFuture2 = mExecutorService.scheduleAtFixedRate(new EchorServer(), 1000, 2000, TimeUnit.MILLISECONDS);
}
}
}
class EchorServer implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
b++;
Log.i("W", "b = " + b);
if (b == 15) {
mFuture2.cancel(false);
}
}
}