如何优化定时任务执行-Java配置定时器-哪种方式更高效

教程大全 2026-01-27 13:32:38 浏览

Java 配置定时器

在Java编程中,定时器是一种非常有用的功能,它可以帮助我们按照指定的时间间隔执行特定的任务,Java提供了多种方式来实现定时器功能,其中最常用的是使用 java.util.Timer java.util.TimerTask 类,以及 java.util.concurrent.ScheduledexecutorService 接口。

使用Timer和TimerTask

创建Timer对象

我们需要创建一个对象,它是定时器的核心。

Timer timer = new Timer();

创建TimerTask对象

创建一个对象,它代表要执行的任务。

TimerTask task = new TimerTask() {@Overridepublic void run() {// 在这里编写要执行的任务代码System.out.println("任务执行中...");}};

安排任务

使用对象的方法安排任务,该方法可以接受多个参数,包括任务对象、执行任务的时间以及时间间隔。

// 在当前时间后延迟1秒执行一次,每次间隔1秒timer.schedule(task, 1000, 1000);

关闭定时器

当不再需要定时器时,应该关闭它以释放资源。

timer.cancel();

使用ScheduledExecutorService

创建ScheduledExecutorService对象

使用 Executors.newScheduledThreadPool 方法创建一个 ScheduledExecutorService 对象。

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

安排任务

使用 scheduleAtFixedRate scheduleWithFixedDelay 方法安排任务,这两个方法都接受任务、开始执行任务的时间以及执行任务的间隔。

// 在当前时间后延迟1秒开始执行,之后每2秒执行一次scheduler.scheduleAtFixedRate(task, 1000, 2000, TimeUnit.MILLISECONDS);

关闭执行器服务

当不再需要执行器服务时,关闭它。

哪种方式更高效
scheduler.shutdown();

比较与选择


在JAVA中的定时器Timer类,有句话如下,它是什么意思。

这里的容器是指运行你的应用程序的环境,比如你是一个servlet,一个websevice服务等托管与Tomcat、Jboss、WebLogic、Websphere这样的服务器中运行,那么Tomcat、Jboss、WeBlogic、Websphere就叫做容器。 因为线程由部署在容器中的应用负责,所以如果应用程序线程控制不力,那么可能会导致内存泄露,或者导致容器崩掉。 也就类似于:容器是宾馆,每个房间给每个人住,每个人就是部署在其中的服务。 一个人房间点火,如果火候控制不利,整个宾馆可能被烧掉,因为宾馆这个容器无法控制人的点火行为。 所以不推荐使用。

java中怎么实现定时功能

这个是我在网上找的不知道是不是你要的:java定时任务Timer 关于定时任务,似乎跟时间操作的联系并不是很大,但是前面既然提到了定时任务,索性在这里一起解决了。 设置定时任务很简单,用Timer类就搞定了。 一、延时执行首先,我们定义一个类,给它取个名字叫TimeTask,我们的定时任务,就在这个类的main函数里执行。 代码如下:package test;import ;public class TimeTaskTest {public static void main(String[] args){ Timer timer = new Timer();(new Task(), 60 * 1000);}}解释一下上面的代码。 上面的代码实现了这样一个功能,当TimeTask程序启动以后,过一分钟后执行某项任务。 很简单吧:先new一个Timer对象,然后调用它的schedule方法,这个方法有四个重载的方法,这里我们用其中一个,public void schedule(TimerTask task,long delay)首先,第一个参数第一个参数就是我们要执行的任务。 这是一个TimerTask对象,确切点说是一个实现TimerTask的类的对象,因为TimerTask是个抽象类。 上面的代码里 面,Task就是我们自己定义的实现了TimerTask的类,因为是在同一个包里面,所以没有显性的import进来。 Task类的代码如下package test;import ;public class Task extends TimerTask { public void run(){(定时任务执行);}}我们的Task必须实现TimerTask的方法run,要执行的任务就在这个run方法里面,这里,我们只让它往控制台打一行字。 第二个参数第二个参数是一个long型的值。 这是延迟的时间,就是从程序开始以后,再过多少时间来执行定时任务。 这个long型的值是毫秒数,所以前面我们的程序里面,过一分钟后执行用的参数值就是 60 * 1000。 二、循环执行设置定时任务的时候,往往我们需要重复的执行这样任务,每隔一段时间执行一次,而上面的方法是只执行一次的,这样就用到了schedule方法的是另一个重载函数public void schedule(TimerTask task,long delay,long period)前两个参数就不用说什么了,最后一个参数就是间隔的时间,又是个long型的毫秒数(看来java里涉及到时间的,跟这个long是脱不了干系了),比如我们希望上面的任务从第一次执行后,每个一分钟执行一次,第三个参数值赋60 * 1000就ok了。 三、指定执行时间既然号称是定时任务,我们肯定希望由我们来指定任务指定的时间,显然上面的方法就不中用了,因为我们不知道程序什么时间开始运行,就没办法确定需要延时多少。 没关系,schedule四个重载的方法还没用完呢。 用下面这个就OK了:public void schedule(TimerTask task,Date time)比如,我们希望定时任务2006年7月2日0时0分执行,只要给第二个参数传一个时间设置为2006年7月2日0时0分的Date对象就可以了。 有一种情况是,可能我们的程序启动的时候,已经是2006年7月3日了,这样的话,程序一启动,定时任务就开始执行了。 schedule最后一个重载的方法是public void schedule(TimerTask task,Date firstTime,long period)没必要说什么了吧:)四、j2ee中的定时任务在实际的项目中,往往定时任务需要对web工程中的资源进行操作,这样一来,用上面的单个程序的方式可能就有点力不从心了,因为很多web工程的资源它操作不到。 解决的办法是,使用Servlet,把执行定时任务的那些代码放到Servlet的init()函数里就可以了,这个easy,就没有必要再写示例代码了吧

求java报java.lang.outofmemoryerror java heap spAce怎么解决?具体如下面的图中

将运行空间设置大点就行了

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐