如何解决在Java这个计时器的问题?(How to solve this Timer issue i

2019-11-03 23:04发布

林发展与定时器的Java电子邮件应用程序中,我有一个名为ActiveProcesses,InActiveProcesses两分的ArrayLists。 如果我启动定时器就会发送电子邮件每秒钟InActiveProcesses列表值。 但问题是计时器要发送的电子邮件,如果InActiveProcesses列表值是same.For例的InActiveProcess列表包含值abcd ,它会发送电子邮件every秒同一个列表值。 我想只发送InActiveProcesses列表包含不同的值的电子邮件。 定时器将检查每一个值如果秒的值不同就会发送电子邮件。 如何使用Java来处理这个问题。 提前致谢。 下面是代码,

for (int i = 0; i < InActiveProcess.size(); i++)
{
    if (!ActiveProcess.contains(InActiveProcess.get(i)))
    {
        list3.add(InActiveProcess.get(i));
    }
}
for (int i = 0; i < ActiveProcess.size(); i++)
{
    if (!InActiveProcess.contains(ActiveProcess.get(i)))
    {
        list3.add(ActiveProcess.get(i));
    }
}
log.info("Processes which are Not Running: " + list3);

StringBuilder sb = new StringBuilder();

for (int k = 0; k < list3.size(); k++)
{

    Result = list3.get(k);

    sb.append(Result.toString());

    sb.append(" ");

}

String message = sb.toString();

log.info(message);

sms.SendMessage("1254554555", message);

es.SendMail("abcdr@gmail.com", " Server process is down", message);

这是我的Timer类。

int delay = 5000; // delay for 5 sec.

int interval = 1000; // iterate every sec.

Timer timer = new Timer();

        timer.scheduleAtFixedRate(new sample() {

        }, delay, interval);

定时器是执行sample()类为每秒钟发送电子邮件到指定的地址。 我要处理的计时器将在同一时间,每秒执行,电子邮件被发送es.SendMail("abcdr@gmail.com", " Server process is down", message); 如果message包含的值是不同的。

Answer 1:

更新 :发布这个答案后改变的问题。 这就是答案,原来的问题:

您可以使用定时器类。

您可以安排当计时器关闭通过采取行动的TimerTask 。 这是一个抽象类,所以你必须扩展它,并实现该方法run()

class MyTimerTask extends TimerTask {

   @Override
   public void run(){
   // Task to do here
 }
}

然后在你的主类

MyTimerTask task = new MyTimerTask(); // this class implements WHAT to do inside the method run();
Date date = new Date(...) // This class will tell timer WHEN to do the task
Timer timer = new Timer(task,date); //Good to go!

或者你可以做Timer timer = new Timer(task,delay)有后执行任务delay毫秒



Answer 2:

我的假设:

  • list3是指的一个实例java.util.List.
  • 您可以修改Result类。

首先,重写Object.equals在你的方法Result类。

  • 咨询Java标准平台API文档 ; 阅读Object.equalsObject.hashCode了解如何正确地覆盖它们。
  • 这里过去的讨论可能会有所帮助:
    • Java的覆盖对象的equals()方法
    • 为什么我们需要重写java中equals和hashCode,为什么我们不能用Object类的实现

然后:

...

log.info("Processes which are Not Running: " + list3);
if (!list3.equals(this.previousList)) {
    // update history for next time
    this.previousList.clear();
    this.previousList.addAll(list3);

    // Prepare and send email
    StringBuilder sb = new StringBuilder();
    for (int k = 0; k < list3.size(); k++)
    {
        Result = list3.get(k);
        sb.append(Result.toString());
        sb.append(" ");
        String message = sb.toString();
        log.info(message);
        sms.SendMessage("1254554555", message);
        es.SendMail("abcdr@gmail.com", " Server process is down", sb);
    }
}

这些进程的列表中的顺序很重要? 例如,在列表“ABCD”和“BADC”有什么不同? 如果答案是否定的,那么java.util.List.equals不能满足您的需求。 在这种情况下,不要使用名单,但套。


编辑:

如果该列表是保证持续有序的(如果“ABCD”绝不可能“坏-C”),有可能 (更便宜)建立,保存和比较来自StringBuilder的创建的字符串,而不是建筑,节能,并比较列表。 这样你就不会实现Result.equalsResult.hashCode无论是。



Answer 3:

看看java.util.Timer中或SheduledExecutorServices



Answer 4:

这可能是轻微无关你的问题,但我不能帮助提的是,你做几乎同样的事情两次,在两个for循环。 如果我理解正确的话,你要确保有没有重复(如存在于两个入口ActiveProcessesInactive Processes )。 如果是这样的话,为什么不重复检查,当您添加到列表中的条目?

至于定时器,我会和以前的答案一致:java.util.Timer中最有可能是你所需要的。 刚开始时有:)

祝好运

编辑:以供将来参考,请尝试指定你的“问题”是关于这个问题,而不是



文章来源: How to solve this Timer issue in java?
标签: java timer