1.scheduleAtFixedRate:
public class TestThread {
private static ScheduledExecutorService eService;
private static long time;
public static void main(String[] args) {
time=System.currentTimeMillis();
eService=Executors.newScheduledThreadPool(3);
eService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println(System.currentTimeMillis()-time+"---------"+Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 0, 3, TimeUnit.SECONDS);
}
}
a.注释:
上面例子是常规用法,任务线程耗时是2s,执行间隔为3s。所以我们看到的打印结果应该是3000,,6000,9000......这样子的(实际上由于线程创建需要时间,结果应该是3020,6020.......这样的,但是间隔是3s是不变的)
b. 假如我们将上述线程任务的时间扩大为5s,
Thread.sleep(2000);
会发现打印结果变成5000,,10000,15000......这样子的,即设置的3s在小于任务执行时间时是不起作用的,此时的间隔时间和任务执行时间有关
2.scheduleWithFixedDelay:
eService.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println(System.currentTimeMillis()-time+"---------"+Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 0, 3, TimeUnit.SECONDS);
注释:
scheduleWithFixedDelay就比较直白了,他的间隔时间为3s,但这个3s是在线程任务执行完成后开始计时的。即实际间隔时间=线程执行时间+设置间隔时间。
如图中例子打印结果就为:5000,10000,15000.....这样子