Есть ли что-то опасное в использовании Thread.currentThread.sleep () в моем основном коде? - PullRequest
3 голосов
/ 13 марта 2009

в моем коде я использую

Thread.currentThread().sleep(sleepTime);

в основной части (не объект Thread) кода.

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

Есть ли лучший способ заставить ваш основной процесс какое-то время сидеть без дела? или это предписанная методология?

EDIT:

В ответ на вопрос, почему я так делаю ...

У меня есть процесс, который подключается через HTTP или FTP к удаленным хостам и делает вещи.

Другими словами ...

материал ...

подключиться к удаленному ...

делать вещи с удаленным подключением ...

закрыть соединение ...

больше вещей ...

повторите при необходимости.

Я обнаружил, что в очень очень редких случаях, связь просто разрывается в la la land. Это не подводит, не бросает никаких исключений, оно просто уходит. И это блокирует, так что нет встроенного способа установить таймер.

Итак, мое решение сделать это ...

материал ...

начать новую тему с подключением к ней ...

войти в бесконечный цикл с таймером в процессе MAIN (а не в порожденном потоке) и ждать либо

a) поток соединения завершает свою задачу и устанавливает для некоторого флага значение «done»

или

b) подождать некоторое заданное количество времени и, если поток соединения не сообщил о завершении, убить его и двигаться дальше.

Именно в основном процессе я намерен поспать некоторое время, проснуться и посмотреть, не истек ли срок действия MAX_WAIT_TIME. Если нет, то возвращайтесь спать и подождите еще немного.

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

Полагаю, мой вопрос на самом деле ... есть ли что-нибудь небезопасное в этом подходе. Я вижу из ответов, что, учитывая то, что я делаю, похоже, что нет. Возможно, я должен был спросить, есть ли более стандартизированный подход?

Ответы [ 8 ]

13 голосов
/ 13 марта 2009

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

Если бы вы могли дать больше указаний, почему вам нужно сделать паузу, и типа приложения, которое вы пишете, это помогло бы.

Еще одна вещь - ваш звонок действительно должен быть:

Thread.sleep(sleepTime);

Вызов его через currentThread() делает его похожим на метод экземпляра, но это не так - это просто обычный статический метод. Вы не можете сделать ни одного другого потока сна.

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

4 голосов
/ 13 марта 2009

Там нет ловушки. Он будет спать столько, сколько вы скажете.

Может быть или не быть ловушка в идее вашего приложения засыпания в течение длительного периода времени.

3 голосов
/ 13 марта 2009

Ну, Thread.sleep - это статический метод, поэтому он вводит в заблуждение. Кроме того, вы не можете проснуться чисто (вы можете прервать, но я бы поспорил, что это чисто) в случае, если вам нужно отключить действие.

3 голосов
/ 13 марта 2009

Это не опасно, но в 99 +% случаев, когда вы думаете, что вам это нужно, на самом деле это не так. Что ты пытаешься сделать?

2 голосов
/ 13 марта 2009

Если вы решите использовать Thread.sleep , убедитесь, что вы обработали InterruptedException соответствующим образом .

0 голосов
/ 14 марта 2009

Люди часто используют Таймер для выполнения отложенных событий, но я предпочитаю ScheduleExecutorService. Вы можете использовать один и тот же пул потоков для всех ваших действий тайм-аута. (Вы можете иметь пул потоков размером 1)

0 голосов
/ 14 марта 2009

AFAIR Thread.sleep() тратит процессорное время, а Object.wait(long timeout) - нет. Поэтому вы всегда должны использовать Object.wait(long timeout) вместо этого. Хотя я не могу найти кадры, которые бы поддерживали мой тезис, я считаю, что при переключении на вызовы Object.wait(long timeout) мы получили значительное повышение производительности.

0 голосов
/ 13 марта 2009

Что ты имеешь в виду, что соединение просто «исчезает»? Конечно, нет встроенного способа установки таймера, но вы можете установить время ожидания соединения и прочитать время ожидания, если хотите.

Создайте сокет с помощью конструктора без аргументов, вызова connect (SocketAddress, int), чтобы вы могли установить время ожидания (в миллисекундах). Если соединение не может быть установлено в это время, генерируется исключение.

И вы можете вызвать setSoTimeout () перед подключением, чтобы любые вызовы read () блокировались только на указанное вами время, а не навсегда. Если данные не могут быть прочитаны в указанное время, возникает исключение.

...