schedule() 和 scheduleAtFixedRate() 的区别--转载

在Java中,有两个用于定时执行任务的方法,分别为schedule()和scheduleAtFixedRate()。两者都是Timer类中的方法,但是在使用时需要注意它们的区别。

首先,schedule()是一种可以延迟指定时间之后执行任务的一种方式。具体来说,它会在指定的时间后仅执行一次任务。在延迟时间完成后,任务仅执行一次,而不再进行后续的执行。这种方式在项目中非常有用,比如在一个程序启动时,需要等待一段时间之后再执行某个操作。

schedule()方法的用法如下:

```java

public void schedule(TimerTask task, long delay)

```

其中,task参数指定要执行的任务,delay参数指定要延迟执行的时间(以毫秒为单位)。

下面是一个使用schedule()方法的例子:

```java

import java.util.Timer;

import java.util.TimerTask;

public class ScheduleTest {

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

System.out.println("开始:" + System.currentTimeMillis());

Timer timer = new Timer();

timer.schedule(new Task(), 3000);

Thread.sleep(5000);

System.out.println("结束:" + System.currentTimeMillis());

}

}

class Task extends TimerTask {

public void run() {

System.out.println("Time's up!");

}

}

```

上述代码执行结果如下:

```

开始:1519058535905

Time's up!

结束:1519058538905

```

从结果可以看出,延迟3秒后,任务只执行了一次。

相比之下,scheduleAtFixedRate()方法则有所不同。该方法可以定期执行任务,即固定时间间隔执行任务,它会以固定的周期来执行任务。这种方式常常被用于需要在设定的时间间隔内进行重复操作的项目,比如定期备份文件到云端等。

scheduleAtFixedRate()方法的用法如下:

```java

public void scheduleAtFixedRate(TimerTask task, long delay, long period)

```

其中,task参数指定要执行的任务,delay参数指定了延迟执行的时间,period参数指定了每次执行任务之间的时间间隔。

下面是一个使用scheduleAtFixedRate()方法的例子:

```java

import java.util.Timer;

import java.util.TimerTask;

public class ScheduleTest {

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

System.out.println("开始:" + System.currentTimeMillis());

Timer timer = new Timer();

timer.scheduleAtFixedRate(new Task(), 3000, 2000);

Thread.sleep(10000);

System.out.println("结束:" + System.currentTimeMillis());

timer.cancel();

}

}

class Task extends TimerTask {

int count = 1;

public void run() {

System.out.println("第" + count + "次执行任务。");

count++;

}

}

```

上述代码执行结果如下:

```

开始:1519059586960

第1次执行任务。

第2次执行任务。

第3次执行任务。

第4次执行任务。

第5次执行任务。

第6次执行任务。

第7次执行任务。

第8次执行任务。

第9次执行任务。

第10次执行任务。

结束:1519059598961

```

从结果可以看出,使用scheduleAtFixedRate()方法定期执行的任务会在固定时间间隔内一直执行,直到Timer被取消。

最后,再说一点需要注意的地方:Timer类在使用时需要注意线程安全性。如果Timer的多个任务执行时间过长,则可能会出现“任务堆积”的情况,即后面的任务在上一次任务执行完成之前开始进行,这样可能会导致任务冲突和资源耗尽等问题。因此,在使用Timer类时需要结合具体的需求和应用场景,小心谨慎地去使用它们。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(28) 打赏

评论列表 共有 1 条评论

苦瓜汁i 1年前 回复TA

有一天我会从自己身边默默地走开,不带任何声响。我错过了很多,我总是一个人难过。

立即
投稿
发表
评论
返回
顶部