整理:java定时器。

本文纯属个人思路,如有错误,请指正。

java的Timer依赖Thread,每一个Timer实际上都是一个Thread。

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

import java.util.TimerTask;

/**

 * 本类仅为实现TimerTask,意义不大。

 * @author 9082046**@qq.com

 *

 */

public class Task  extends
TimerTask

{  

    public
void run()

    {

        System.out.println(this.hashCode());       

    }

}

在win7 的myeclipse8.5的默认安装后的未做任何调节的开发环境下:

方案一:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

import java.util.Timer;

/**<br> * 启动1w个Timer

 * @author 9082046**@qq.com

 *

 */

public class TestTimer

{  

    public
static void main(String[] args)

    {

        add(10000);

    }

    public
static void add(int amount)

    {      

        for(int
index=0;index < amount; index ++)

        {          

            Timer timer=new
Timer();

            timer.schedule(new
Task(), Integer.MAX_VALUE);

        }

    }

}

启动1w个的Timer,结果如下:

才1w个Timer提示jvm的内存不够使的了。

方案二:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

/**

 *

 */

package
linked_array;

import java.util.Random;

import java.util.Timer;

/**

 * @author [email protected]

 *

 */

public
class TestTimer

{  

    public
static void main(String[] args)

    {

        add(10000);

    }

    public
static void add(int amount)

    {      

        Timer timer=new
Timer();

        for(int
index=0;index < amount; index ++)

        {          

            timer.schedule(new
Task(), Integer.MAX_VALUE);

        }

    }

}

同一个Timer调度1w个TimerTask,至少在运行5分钟后没出什么Error。。。。貌似有点囧,也没任何输出,写的Timer调度TimerTask的延迟时间有点大,哈。

在实际应用中,Timer存在计时器线程终止 或者 计时器取消 导致的 IllegalStateException,单个Timer
或许不太适合长时间 调度 非重复事件
TimerTask。

原因:对 Timer 对象最后的引用完成后,并且
所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。出自:jdk
api 1.6.0 java.util  类 Timer。

方案三:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

/**

 * @author 9082046**@qq.com

 *

 */

public class User

{

    private
int user_id;

    // 用来标识时间

    private
int time_stamp;

    public
User(int
userId, int
timeStamp)

    {

        user_id = userId;      

        time_stamp = timeStamp;

    }

    

    public
int getUser_id()

    {

        return
user_id;

    }

        

    public
int getTime_stamp()

    {

        return
time_stamp;

    }

    public
void setTime_stamp(int
timeStamp)

    {

        time_stamp = timeStamp;

    }  

}

/**

 * @author 9082046**@qq.com

 *

 */

public
class Test_Timer

{

    private
static ArrayList<User> list=new
ArrayList<User>(); 

    private
static Random randam=new
Random();

    

    // 计时用,每秒加一。或者直接用时间戳吧。

    private
static int timeS = 0;  

    private
static final int tenS = 10;

    

    public
static void main(String[] args)

    {

        add(10000);

        

        while(true)

        {

            try

            {

                Thread.sleep(1000);

            }

            catch
(InterruptedException e)

            {

                

            }          

            traveral();

            timeS++;

        }      

    }

        public
static void add(int amount)

        {

            for(int
index=0;index < amount; index ++)

            {

                int
random = randam.nextInt(1000);

                User user =new
User(index,random);         

                list.add(user );

            }

        }

        

        /**

         * 遍历全部的玩家。

         */

        public
static void traveral()

        {

            int
amount=list.size();

            User user = null;

            for(int
index=0;index < amount; index ++)

            {      

                user = list.get(index);

                if(user.getTime_stamp() < timeS)

                {

                    System.out.println("userId:"+user.getUser_id() +","
+user.getTime_stamp());

                    user.setTime_stamp(user.getTime_stamp()+tenS);

                }

            }

        }

}

使用Thread.sleep() +
遍历全部数据实体并比较时间标记位
   :模拟计时器。

个人注:

①、 主动让系统回收垃圾对象:System.gc()。

②、方案二 和 方案三 都存在缺陷, 如果存在长耗时的任务,会导致后续的部分任务 晚于预设的时间标识点才能执行。

整理:java定时器。,布布扣,bubuko.com

时间: 2024-10-01 05:06:04

整理:java定时器。的相关文章

java定时器

以下内容根据 JavaTM Tutorial 和相关API doc和网上的资料翻译整理,以供日后查看和参考: 1.描述 Timer是一种定时器工具,用来在一个后台线程计划执行指定任务.它可以计划执行一个任务一次或反复多次. TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务. 简单的一个例程: import java.util.Timer; import java.util.TimerTask; /** * Simple demo that uses java.util.T

Java 定时器使用

// 定时器 privateTimer timer; timer = new Timer(); timer.schedule(new TimerTask() { public void run() { task(); } }, new Date(), 60*1000); public void task() { } Java 定时器使用,布布扣,bubuko.com

Android 开发之错误整理java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10088 nor current process has android.permission.READ_PHONE_STATE.

java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10088 nor current process has android.permission.READ_PHONE_STATE. 今天写了一款发短信的软件,拿了个酷派5879,试了下,结果不能用,把try{}catch{}去掉了,报这个错误, android.permission.READ_PHONE_STATE.没有READ_PHONE_STATE权限,

java定时器实现总结

前言:Java定时器目前主要有3种实现方式:JDK组件,Spring Task,Quartz框架. 1. JDK组件(1) java.util.TimerTask MyTimerTask.java: public class MyTimerTask extends TimerTask { @Override public void run() { System.out.println("MyTimerTask, now: " + new SimpleDateFormat("y

Java定时器:Timer

项目中往往会遇到需要定时的任务,例如订单,当用户在某个规定时间内没有操作订单时,订单状态将会发生改变. 那么在这种情况下,我们会用到定时器. 举例: 1 import java.util.Timer; 2 3 4 /** 5 * java定时器 6 * @author Administrator 7 * 8 */ 9 public class TimeTaskTest { 10 public static void main(String[] args) { 11 Timer timer = n

java 定时器的使用

在北京这边实习也一个多月了,也接触了不少东西,今天领导开会,说服务器压力太大,客户很不满意,访问速度上要求很苛刻,我们项目里的一些操作,没有必要写成动态的都改写成静态的,每天定时更新一下静态html页面里面的内容(因为客户每天会定时更新一些内容,而且只更新一次). 听得我好蒙啊,我头一次听说java 的定时操作呢!要命的东西,好坑的啊,晚上抽出了时间,学习了一下java的定时器,也就是一些基本的操作. java定时器主要用到两个类:Timer(计划任务调度类)和TimerTask(具体任务类)

个人整理--Java编码规范

编码规范对于开发人员来说是非常重要的,有以下几个原因: 1.一个软件的生命周期中,80%的花费在于维护 2.几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护 3.编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的代码 4.如果你将源码作为产品发布,就需要确任它是否被很好的打包并且清晰无误,一如你已构建的其它任何产品 5.为来自不同的项目组或个人提供标准的代码格式. 6.增加易读性. 在不用Java两年多后因工作需要我又要转入Java开发,为此我整理出下面的编码规范,

IT form整理 java应该注意的问题2

1,Switch 语句内的表达式必须为: byte  ,char ,short ,int 这四种之一. 2,使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的. 例如,对于如下语句: final StringBuffer a=new StringBuffer("immutable");执行如下语句将报告编译期错误: a=new StringBuffer("");但是,执行如下语句则可以通过编译: a.append(&q

Java定时器TimeTask

package com.alan.timer; import java.util.Calendar;import java.util.Date;import java.util.Timer;import java.util.TimerTask;/** * Java定时器 * @author 邵海雄 * @date 2016年9月27日 下午5:38:19 * @version v1.0 */public class TimerTest { // 第一种方法:设定指定任务task在指定时间time