timer 加快 java_java timer 定时器

###

以下内容根据 The JavaTM Tutorial 和相关API doc翻译整理,以供日后参考:

1、概览

Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。

TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。

简单的一个例程:

a217a13be457f758ef2652638dca5a28.png import java.util.Timer;

ab9e4b8a9d787f1d6d9c24416d56acd5.png import java.util.TimerTask;

f849dc3503ac0a1302b1ad2eb28a311c.png

bf8ca73fe9c481c8a5663f0e0f3b78cb.png /**

18bc1c0537f8a44945c8de991e673186.png* Simple demo that uses java.util.Timer to schedule a task to execute

49fb20ad85924fd307785e6bc06c8987.png* once 5 seconds have passed.

9cf5810626ae301606ed04ec878e9258.png*/

4ef96840f1a85ccbccccfe831579d9f2.png

ac5a69f0245b42a97ac84d26d2a91c21.png public class Reminder {

11c72fdb63def4885e8766dfd95a9e43.png Timer timer;

a817751d86ef610ec8d4e3d68385f96e.png

bb670344564c6168c72766a36357b04c.pngpublic Reminder(int seconds) {

62dff06055d731494d67ac855fbfc991.png timer =new Timer();

2c4eacc728a1d21f258ff756ba810486.png timer.schedule(new RemindTask(), seconds*1000);

c46f02763ff136018b83c5b07e945064.png }

17f1a0831c81a6102434b74f64f0251d.png

5d33eb3e6321865bfa1eb443a2b29793.pngclass RemindTask extends TimerTask {

e0e632f6e44617b779161bc19558c7a1.pngpublicvoid run() {

6bd1d6af1ad09ec23d53501bcf7812f4.png System.out.println(“Time’s up!”);

85da318e57c6da21f9bcc6e5f57f3bbd.png timer.cancel(); //Terminate the timer thread

ddfcaa623ec11b21e3b61bf562e6029f.png }

77a0ee5404060923e266d89639c3a2ee.png }

7b9103a6533db9e84f7bd974e774d627.png

0fdc49521c3932eb02b7bb3f3794e81f.pngpublicstaticvoid main(String args[]) {

08f01cb757368ac7f21fb4440a5a843b.png System.out.println(“About to schedule task.”);

bbc3ad22d2657c40ac3a6ec35edf1552.pngnew Reminder(5);

650122b70d2e51fcc1d4ac6ed1953478.png System.out.println(“Task scheduled.”);

130a9ab060dc551ccb2a5fc177ba68da.png }

9f880def8a99c6084ccc09a3d382d7c9.png}

407a22f774a6a6d400baf7d3a77d8345.png

运行这个小例子,你会首先看到:

About to schedule task.

5秒钟之后你会看到:

Time’s up!

这个小例子可以说明一些用Timer线程实现和计划执行一个任务的基础步骤:

实现自定义的TimerTask的子类,run方法包含要执行的任务代码,在这个例子里,这个子类就是RemindTask。

实例化Timer类,创建计时器后台线程。

实例化任务对象 (new RemindTask()).

制定执行计划。这里用schedule方法,第一个参数是TimerTask对象,第二个参数表示开始执行前的延时时间(单位是milliseconds,这里定义了5000)。还有一种方法可以指定任务的执行时间,如下例,指定任务在11:01 p.m.执行:

//Get the Date corresponding to 11:01:00 pm today.

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.HOUR_OF_DAY, 23);

calendar.set(Calendar.MINUTE, 1);

calendar.set(Calendar.SECOND, 0);

Date time = calendar.getTime();

timer = new Timer();

timer.schedule(new RemindTask(), time);

2、终止Timer线程

默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。当然,你可以通过以下四种方法终止一个timer线程:

调用timer的cancle方法。你可以从程序的任何地方调用此方法,甚至在一个timer task的run方法里。

让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行。

当timer相关的所有task执行完毕以后,删除所有此timer对象的引用(置成null),这样timer线程也会终止。

调用System.exit方法,使整个程序(所有线程)终止。

Reminder 的例子使用了第一种方式。在这里不能使用第二种方式,因为这里需要程序保持运行直到timer的任务执行完成,如果设成daemon,那么当main线程 结束的时候,程序只剩下timer这个daemon线程,于是程序不会等timer线程执行task就终止了。

有些时候,程序的终止与 否 并不只与timer线程有关。举个例子,如果我们使用AWT来beep,那么AWT会自动创建一个非daemon线程来保持程序的运行。下面的代码我们对 Reminder做了修改,加入了beeping功能,于是我们需要加入System.exit的调用来终止程序。

31575fcf9cfef46f81f94f8ed59b663a.png import java.util.Timer;

2a484d4ebd9c7f6a698a536ff3735a10.png import java.util.TimerTask;

f7572b8ceab8b79632526a645f955ad0.png import java.awt.Toolkit;

7ec349c97b689529d794e5ead7883a71.png

275e5a396e25db8711fdcf359338678a.png /**

5cb7ef9888e70831da39c972f3e2b0c0.png* Simple demo that uses java.util.Timer to schedule a task to execute

187225f6f49cbc48520de2d85b5a04b8.png* once 5 seconds have passed.

c4e7eb6ab0746cab1f999ec85de28a75.png*/

9711038a439dc031d287d5bb0ecfebb4.png

13ba138cf9e13bda0566d5b0da867bab.png public class ReminderBeep {

3bfcf8c3de1f9f7d6ac869af97a2c2ce.png Toolkit toolkit;

ee162e2199b3f7607855436783edc812.png Timer timer;

c64308a170b6f26ed1c6b30fe73a214b.png

fc812e66e0333d4e2a3dbd57a79aa0c7.pngpublic ReminderBeep(int seconds) {

02cbeabc508744c26f985682885bb2fc.png toolkit = Toolkit.getDefaultToolkit();

8c78f9d2ae737b0d879c6b5faeb78a0a.png timer =new Timer();

c1ac3f28edcc4437f44f2d6ff769b988.png timer.schedule(new RemindTask(), seconds*1000);

bfc99c833fb5c16a851e1a84d25b69c3.png }

62049f71886ef2445c000d88d5e7161d.png

bcb1ce2ed090072be34aebcdd6a8b100.pngclass RemindTask extends TimerTask {

ac0da7dc37937c6351bfdff6b9061ef9.pngpublicvoid run() {

c72d8a84630c392866488b9ed9a70a7a.png System.out.println(“Time’s up!”);

773c39417cb5d7d5feb1cfa6a30a38a5.png toolkit.beep();

7894f1f0926c54271aae3cd4cbe6ffea.png//timer.cancel(); //Not necessary because we call System.exit

3afd338e1aec68a2664ba4f674afdca0.png System.exit(0); //Stops the AWT thread (and everything else)

d6f7d362dccdbe32962cce24e832c8cd.png }

ae6175500cabdd10cc3d4d782c3f8e2e.png }

1cc5dd4e51108962cefda6f36d2c37f7.png

f3c85d7cabe09a63d3fef1b3331c8e42.pngpublicstaticvoid main(String args[]) {

1df0eeb56c54962d4c4fc4cd7e607777.pngSystem.out.println(“About to schedule task.”);

e6e23344c3125667198b32ef1b355671.pngnew ReminderBeep(5);

291fc7c44565a200c8b06a73063f6293.pngSystem.out.println(“Task scheduled.”);

760126e4bfe591bd7813ddace9538085.png }

18401996a743cdca45f22d5b4e791e2c.png}

cdcc1a98309528784cb14fd5c840f005.png

3、反复执行一个任务

先看一个例子:

85dcfd8bade9356bbcfb25936405fa69.png public class AnnoyingBeep {

7c12805283ef60cdf686bb47b5fb2386.png Toolkit toolkit;

01cc7a94383456c4337624833b8aa03d.png Timer timer;

18a8ba4f6ca0e28673758b5c28ca1887.png

00bf6d9ba44b87577f81e64b437494ce.pngpublic AnnoyingBeep() {

94a83ef8ed1259d0316b780b6d62a98b.png toolkit = Toolkit.getDefaultToolkit();

ca9459944a5e0f727a1d4a4d8992586b.png timer =new Timer();

e0a7726deccb1ff3fd8e09c38938efa4.png timer.schedule(new RemindTask(),

06b6f75af88bff700db293f34334710a.png0, //initial delay

198cac21248aa93b5002e8fd4cef339f.png1*1000); //subsequent rate

265ac0bc31ae5ddce2866acc4d7575b8.png }

d6339a5fc0407f597cf7048c870ae15a.png

41122ff47a28dab4174ef526c37cc8a1.pngclass RemindTask extends TimerTask {

8c8706aa4de0049f60841775b0499a7f.pngint numWarningBeeps =3;

209273876477a5aea5b689741c215778.png

a0b72db3084e7a1d0475f503e259887b.pngpublicvoid run() {

5177debe0f62af7cfb100a3442410d88.pngif (numWarningBeeps >0) {

621bb6b2ed087856976579640f4f8410.png toolkit.beep();

9299c6789e23833b027d28be4611ea9a.png System.out.println(“Beep!”);

f0acb3a5792d1ef2531f7e8b49525b4a.png numWarningBeeps--;

de0dd3d57919ea848f9c1ad1631109df.png }else{

e680b522e7c744c098ba27edc7225518.png toolkit.beep();

2261c838c3c374b3dbf3af0be83ea34c.png System.out.println(“Time’s up!”);

dd5c2740ac6f2582229cc6d37550d4a8.png//timer.cancel(); //Not necessary because we call System.exit

ead6f051f8f0cc89046d70227450c04b.png System.exit(0); //Stops the AWT thread (and everything else)

13779936e15a6821234754610f4cf72e.png }

ee7a413a098c10f7e5f57198b29b1312.png }

92e69c096e611a245c48e9b06f3ddcd3.png }

0826026fc3bdf42dee368ef230ab6bbd.png

c6778b5b8419c94678910cb963aa555d.png}

执行,你会看到如下输出:

Task scheduled.

Beep!

Beep! //one second after the first beep

Beep! //one second after the second beep

Time’s up! //one second after the third beep

这里使用了三个参数的schedule方法用来指定task每隔一秒执行一次。如下所列为所有Timer类用来制定计划反复执行task的方法 :

schedule(TimerTask task, long delay, long period)

schedule(TimerTask task, Date time, long period)

scheduleAtFixedRate(TimerTask task, long delay, long period)

scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

当 计划反复执行的任务时,如果你注重任务执行的平滑度,那么请使用schedule方法,如果你在乎的是任务的执行频度那么使用 scheduleAtFixedRate方法。 例如,这里使用了schedule方法,这就意味着所有beep之间的时间间隔至少为1秒,也就是说,如 果有一个beap因为某种原因迟到了(未按计划执行),那么余下的所有beep都要延时执行。如果我们想让这个程序正好在3秒以后终止,无论哪一个 beep因为什么原因被延时,那么我们需要使用scheduleAtFixedRate方法,这样当第一个beep迟到时,那么后面的beep就会以最快 的速度紧密执行(最大限度的压缩间隔时间)。

4、进一步分析schedule和scheduleAtFixedRate

(1) 2个参数的schedule在制定任务计划时, 如果指定的计划执行时间scheduledExecutionTime<= systemCurrentTime,则task会被立即执行。scheduledExecutionTime不会因为某一个task的过度执行而改变。

(2) 3个参数的schedule在制定反复执行一个task的计划时,每一次执行这个task的计划执行时间随着前一次的实际执行时间而变,也就是 scheduledExecutionTime(第n+1次)=realExecutionTime(第n次)+periodTime。也就是说如果第n 次执行task时,由于某种原因这次执行时间过长,执行完后的systemCurrentTime>= scheduledExecutionTime(第n+1次),则此时不做时隔等待,立即执行第n+1次task,而接下来的第n+2次task的 scheduledExecutionTime(第n+2次)就随着变成了realExecutionTime(第n+1次)+periodTime。说 白了,这个方法更注重保持间隔时间的稳定。

(3)3个参数的scheduleAtFixedRate在制定反复执行一个task的计划时,每一 次 执行这个task的计划执行时间在最初就被定下来了,也就是scheduledExecutionTime(第n次)=firstExecuteTime +n*periodTime;如果第n次执行task时,由于某种原因这次执行时间过长,执行完后的systemCurrentTime>= scheduledExecutionTime(第n+1次),则此时不做period间隔等待,立即执行第n+1次task,而接下来的第n+2次的 task的scheduledExecutionTime(第n+2次)依然还是firstExecuteTime+(n+2)*periodTime这 在第一次执行task就定下来了。说白了,这个方法更注重保持执行频率的稳定。

5、一些注意的问题

每一个Timer仅对应唯一一个线程。

Timer不保证任务执行的十分精确。

Timer类的线程安全的。

https://www.cnblogs.com/o-andy-o/category/365719.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值