Подтвердить что ты не робот

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

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

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();
    }
}
4b9b3361

Ответ 1

если ваш сервер работает под Linux, вы можете попасть в Leap Second bug, который появляется на прошлой неделе.

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

Ответ 2

Если ваши серверы используют NTP (как вы упомянули), а использование вашего процессора идет на 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"` 

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

Ответ 3

Это похоже на второй прыжок.

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

date -s "`date`"

и он исправил проблему для меня