【问题标题】:Java.lang.IllegalArgumentException: timeout value is negativeJava.lang.IllegalArgumentException:超时值为负
【发布时间】:2014-05-22 16:25:34
【问题描述】:

我有一个线程每天在给定时间运行。 它给了我这个错误信息:

2014-05-21 03:57:06 [CRITICAL][AlertMgr]:维护:

java.lang.IllegalArgumentException:超时值为负 在 java.lang.Thread.sleep(本机方法) 在 com.orca.pf.tc50.managerutilities.maintenance.MaintenanceManager.backgroundProcess(未知 资源) 在 com.orca.pf.tc50.managerutilities.maintenance.MaintenanceManager.access$000(未知 资源) 在 com.orca.pf.tc50.managerutilities.maintenance.MaintenanceManager$1.run(未知 资源) 在 java.lang.Thread.run(Thread.java:745)。

你知道是什么原因造成的吗?

谢谢

private void backgroundProcess()
{
    Calendar                    cal;

    cal = Calendar.getInstance();

    log.addHelpField("AlertMgr");

    /*
     * Synchronise le calendrier a 3:00AM
     */
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

    if (cal.get(Calendar.HOUR_OF_DAY) > HOUR_START)

    {
        /*
         * wait till tomorrow
         */
        cal.set(Calendar.HOUR_OF_DAY, HOUR_START);
        cal.add(Calendar.DAY_OF_YEAR, 1);
    }
    else
    {
        cal.set(Calendar.HOUR_OF_DAY, HOUR_START);   
    }

    do
    {
        try
        {
            /*
             * Calculate the time to wait
             */
            long timeToWait = cal.getTimeInMillis() - System.currentTimeMillis();

            Thread.sleep(timeToWait);


            processAllEntries();

            /*
             * wait for tomorrow
             */
            cal.add(Calendar.DAY_OF_YEAR, 1);


            /*
             * Clear 
             */
            Thread.interrupted();
        }
        catch(InterruptedException i)
        {
            Thread.currentThread().interrupt();
        }
        catch(Exception ex)
        {
            log.addException(LogLevel.CRITICAL, "maintenance", ex);
        }

    }
    while(!th.isInterrupted());
}

【问题讨论】:

  • 当前时间是现在,日历是过去,减去它会得到一个负值。
  • 如果日历是过去的 w 添加一天 if (cal.get(Calendar.HOUR_OF_DAY) > HOUR_START) cal.add(Calendar.DAY_OF_YEAR, 1);

标签: java multithreading timeout illegalargumentexception


【解决方案1】:

我有一个建议给你,而不是使用 Thread.sleep() 尝试研究 Java Timer class。它将简化您每 x 小时安排一次作业的任务。它将节省您计算睡眠时间以安排下一个任务的工作量。此类让您专注于业务逻辑并负责安排任务的工作。

【讨论】:

  • 实际上我希望线程在给定时间不是每 x 小时一次。所以即使程序重新启动执行时间也不会改变
  • 你也可以使用定时器来做到这一点
猜你喜欢
  • 1970-01-01
  • 2013-12-03
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
相关资源
最近更新 更多