Вопрос по java, sleep – Thread.sleep () никогда не возвращается

20

У меня странная ошибка сThread.sleep() на Яве. Почему-то, когда я вызываю sleep на некоторых машинах, он никогда не возвращается. Я не могу понять, что может быть причиной такого поведения. Во-первых, я думаю, что ошибка может быть в другом месте моего кода, поэтому я сделал самый простой тест сна:

public class SleepTest {
    public static void main (String [] args) {
        System.out.println ("Before sleep...");
        try {
            Thread.sleep (100);
        } catch (InterruptedException e) {
        }
        System.out.println ("After sleep...");
    }
}

На большинстве машин это работает, но на нескольких машинах, к которым я удаленно подключаюсь, оно останавливается на неопределенное время между операторами печати. Я ждал до получаса без изменений в поведении. Машины, которые отображают эту ошибку, являются машинами Linux. Вот некоторая информация о машинах:

$ uname -a
Linux zone29ea 2.6.32-220.17.1.el6.x86_64 #1 SMP Tue May 15 17:16:46 CDT 2012 x86_64 x86_64 x86_64 GNU/Linux
$ java -version
java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.6) (rhel-1.43.1.10.6.el6_2-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)

Что может быть причиной такого поведения?

ОБНОВИТЬ

Пересмотренная версия, которая до сих пор никогда не заканчивается:

public class SleepTest {
    public static void main (String [] args) {
        new Thread () {
            public void run () {
                System.out.println ("Before sleep...");
                try {
                    Thread.sleep (100);
                } catch (InterruptedException e) {
                    e.printStackTrace ();
                }
                System.out.println ("After sleep...");
            }
        }.start();
    }
}
@AdelBoutros Я думаю, что если бы произошла ошибка, программа работала бы (и печатала "после ....") giorashc
Вы уверены, что проблема не в восстановлении второго отпечатка (как вы делаете это удаленно)? Может быть, отсутствующий флеш?Thread.sleep(100); работает даже на Linux. Denys Séguret
Вы проверили, не произошла ли ошибка в вашем улове? может быть, printStackTrace? Adel Boutros
Можете ли вы попробовать это в отдельном потоке, чтобы убедиться, что это все еще происходит? то, что вы делаете, это укладывает основной поток в спящий режим, что может вызвать проблему John Kane
у вас есть возможность запустить код внутри профилировщика, такого как jvisualvm, и получить отладочную информацию по этому вопросу? posdef

Ваш Ответ

3   ответа
1

На основании сообщения отhttps://lkml.org/lkml/2012/7/1/19, Я сделал:

date -s "`date`"

и это решило проблему для меня

3

процессора достигает 100%, проверьте наличиеClock: inserting leap second 23:59:60 UTC в вашемdmesg:Если вы обнаружите, что ваш сервер затронутLeap Second bugК сожалению, Java наиболее эффективна.

Чтобы решить эту проблему, без перезапуска любых серверов (например, tomcat) выполните следующие команды.

/etc/init.d/ntp stop
date `date +"%m%d%H%M%C%y.%S"` 

Надеюсь это поможет..

К сожалению, у меня не было root-доступа, чтобы попробовать это решение. 101100
13

Прыжок Вторая ошибка который появляется в прошлые выходные.

Эта ошибка затрагивает ядро Linux (управление потоками), поэтому приложение, использующее потоки (например, JVM, mysql и т. Д.), Может потреблять высокую нагрузку на процессор.

Так что ошибка действительно хороший кандидат. Перезагрузка серверов должна решить вашу проблему.
Я посмотрю на это. Ошибка действительно началась после 1 июля, и эти машины используют NTP. 101100
Мне удалось получить физический доступ для перезагрузки компьютеров сегодня, и это решило проблему. 101100
Нет, високосная секунда была добавлена в последнюю минуту последнего часа последнего дня июня. Но процесс NTP вашего сервера может иметь проблемы. Перезагрузка может решить проблему.

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