如何在Java中创建一个定时器数组

3
我知道我可能有些偏离主题,但我正在尝试创建一个计时器数组,以便mytimer [0],mytimer [1],mytimer [2]等都以不同的间隔触发,并发送不同的事件到服务器。 有什么想法吗? for循环值为6只是为了测试目的而设置的有机数。该数字将根据程序的xml文件中的设置稍后决定。
Timer mytimers[] = new Timer[6]; 
for(int i = 0;i < 6;i++){
    final int mytime = i;
    mytimers[i].scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
            //do action
            sendData("Timer " + mytime + " fired");              
        }
    }, 10000, i*1000);
}

当我从NetBeans IDE运行它时,它会抛出以下错误:[ERROR]: java.lang.NullPointerException。 - user1305988
1
第一行代码是否可以编译通过?它里面的数组在哪里? - Thilo
3个回答

8
Timer mytimers[] = new Timer(); 

我猜这一行是不起作用的?你不能使用对象来初始化数组,应该使用数组进行初始化:

Timer mytimers[] = new Timer[6];

再猜一下,您也没有初始化各个计时器:
mytimers[i].scheduleAtFixedRate(new TimerTask() {

此时mytimers[i]未被设置为任何值,那么如何在其上调用scheduleAtFixedRate?请先对其进行初始化:

mytimers[i] = new Timer();
mytimers[i].scheduleAtFixedRate(new TimerTask() {

编辑:

你的“IllegalArgumentException:非正周期”是因为在第一次循环时,i = 0,所以 i * 1000 = 0,而周期不能为0(“每0秒运行此事件”)。

i = 1 开始就应该没问题了。


正确的代码应该是: Timer mytimers[] = new Timer[6]; 这段代码可以编译通过,但在Netbeans IDE输出窗口中会抛出上述错误。 - user1305988
@user1305988 - 请复制并粘贴您的完全相同的代码到问题中。 - Brendan Long
好的,我进行了更改,现在在IDE输出窗口中出现了一个新错误:[ERROR]:java.lang.IllegalArgumentException:非正周期。 - user1305988
那将是有意义的。几乎和除以零一样糟糕。 - user1305988
感谢Brendan和其他所有人的帮助。 - user1305988
显示剩余3条评论

0
你有没有考虑过只使用一个计时器,然后将所有不同的事件放在某种形式的 (if timeElapsed % timerinterval[1] == 0) 中,这样你就可以通过只使用一个计时器来模拟不同的时间。然后你只需要一个整数数组来存储计时器间隔即可。

0

使用这个:

Timer mytimers[] = new Timer[6]; 
for(int i = 0;i < 6;i++){
    mytimers[i] = new Timer();
    final int mytime = i;
    mytimers[i].scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
            //do action
            sendData("Timer " + mytime + " fired");              
        }
    }, 10000, i*1000);
}

问题在于,您正在对数组调用Timer()构造函数,并且从未初始化各个计时器。相反,您应该将数组作为数组进行初始化,将各个计时器作为计时器进行初始化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接