Поток, не просыпающийся от Потока. Сон ()

Метод

SimpleDateFormat#format принимает параметр Date в качестве параметра. Вы можете получить Date из Calendar, вызвав его метод getTime:

public static String format(GregorianCalendar calendar){
    SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");
    fmt.setCalendar(calendar);
    String dateFormatted = fmt.format(calendar.getTime());
    return dateFormatted;
}

Также обратите внимание, что месяцы начинаются с 0, поэтому вы, вероятно, имели в виду:

int month = Integer.parseInt(splitDate[1]) - 1;
5
задан d4nt 27 August 2008 в 10:56
поделиться

8 ответов

Закопать и узнать? Прикрепите отладчик на того ублюдка!

Я вижу, по крайней мере, следующие возможности:

  1. система регистрации зависает;
  2. поток, из которого выходят очень хорошо, но сервис, все еще работает, потому что некоторая другая часть имеет логическую ошибку.

И возможно, но почти наверняка не, следующее:

  • Сон () зависает.

Но в любом случае, присоединение отладчика покажет Вам, является ли поток все еще там и зависло ли это действительно.

5
ответ дан 13 December 2019 в 22:20
поделиться

Мы помещаем Поток. Сон в после пару раз, когда база данных ушла и мы возвратились к файлам журналов на 3 ГБ, полным ошибок соединения с базой данных.

Я думал бы, что более оптимальный вариант будет состоять в том, чтобы сделать его так, чтобы Ваша система регистрации захватила дубликаты, так, чтобы это могло записать что-то как, "Предыдущее сообщение было повторено времена N".

Предположите, что я написал стандартную записку о том, как необходимо открыть соединение в прошлый момент и закрыть его при первой возможности, вместо того, чтобы охватить потенциально огромную функцию в способе, которым Вы сделали его (но возможно который является артефактом Вашего демонстративного кода, и Ваше приложение на самом деле записано правильно).

Когда Вы говорите, что это сообщает об ошибке, которую Вы описываете, Вы подразумеваете, что этот обработчик сообщает об ошибке? Причина это не ясно мне, состоит в том, что во фрагменте кода Вы говорите, что "Что-то пошло не так, как надо", но Вы не сказали это в своем описании; я не хотел бы, чтобы это было чем-то столь глупым, как исключение поймано где-то в другом месте, и код застревает где-нибудь кроме сна.

3
ответ дан 13 December 2019 в 22:20
поделиться

Вы попытались использовать Монитор. Импульс (гарантируют Ваш поток, использует управление потоком прежде, чем выполнить это) заставить поток делать что-то? Если это работает, то Вы оказываетесь перед необходимостью немного больше изучать свою логику поточной обработки.

0
ответ дан 13 December 2019 в 22:20
поделиться

Из кода Вы отправили, не ясно, что после того, как исключение выдается, система определенно может перезапустить - например, если исключение прибудет из doStuff (), то поток управления будет пасовать назад (после 10-минутного ожидания) к openConnection (), никогда не проходя closeConnection ().

Но поскольку другие сказали, просто присоединяют отладчик и находят, где это на самом деле.

0
ответ дан 13 December 2019 в 22:20
поделиться

Попробуйте поток. Сон (10 * 60 * 1000)

0
ответ дан 13 December 2019 в 22:20
поделиться

Я никогда полностью выяснил то, что продолжалось, но это, казалось, было связано с ThreadInterruptedExceptions, бросаемым во время 10-минутного сна, таким образом, я изменился на код к:

private void ThreadWorkerFunction()
{
  DateTime? timeout = null;

  while (!_stop)
  {
    try
    {
      if (timeout == null || timeout < DateTime.Now)
      {
        openDatabaseConnections();

        doStuff();

        closeDatabaseConnections();
      }
      else
      {
        Thread.Sleep(1000);
      }
    }
    catch (ThreadInterruptedException tiex)
    {
      log.Error("The worker thread was interrupted... ignoring.", tiex);
    }
    catch (Exception ex)
    {
      log.Error("Something went wrong.", ex);

      timeout = DateTime.Now + TimeSpan.FromMinutes(10);
    }
  }
}

Кроме специфической ловли ThreadInterruptedException, это просто чувствует себя более безопасным, поскольку весь сон происходит в блоке попытки, таким образом, что-либо неожиданное, которое происходит, будет зарегистрировано. Я обновлю этот ответ, если я когда-нибудь узнаю больше.

0
ответ дан 13 December 2019 в 22:20
поделиться

Споткнувшийся на этом при поиске Потока. Моя собственная проблема сна. Это может или не может быть связано, но если Ваш doSomething () выдаст исключение, то closeDatabaseConnections () не произойдет, который имеет некоторый потенциал для утечек ресурсов.. Я вставил это наконец блок. Просто что-то для размышления о.

0
ответ дан 13 December 2019 в 22:20
поделиться

У меня была точно такая же проблема. Перемещение строки сна за пределы обработчика исключений устранило для меня проблему, например:

bool hadError = false;
try {
  ...
} catch (...) {
  hadError = true;
}
if (hadError)
  Thread.Sleep(...);

Прерывание потоков, похоже, не работает в контексте обработчика исключений.

2
ответ дан 13 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: