Насколько эффективен Thread.sleep (long)? - PullRequest
3 голосов
/ 07 апреля 2010

Допустим, я хочу «приостановить» поток, чтобы другие потоки могли работать более эффективно. Какой минимальный период сна до того, как блокировка становится бессмысленной (или почти бессмысленной)?

Ответы [ 3 ]

2 голосов
/ 07 апреля 2010

IIRC даже Thread.sleep (0) приведет к тому, что поток сработает, что позволит запускать другие потоки с таким же или более высоким приоритетом.

Это зависит от приоритета потока ... Насколько я понимаю, этот поток.Sleep эффективно выдает поток и устанавливает его приоритет наименьшим на время сна.

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

2 голосов
/ 07 апреля 2010

Я ожидал бы, что любое количество сна будет, по крайней мере, функциональным эквивалентом вызова yield(), поэтому никогда не будет точки, где это "бессмысленно". Определенно существует точка, в которой небольшие значения по существу неразличимы, потому что затраты времени на ожидание возврата операционной системы к вашему потоку дольше, чем небольшое время ожидания. Это, вероятно, происходит где-то в диапазоне 5-10, но, конечно, это будет зависеть от ОС.

2 голосов
/ 07 апреля 2010

Это сложно обобщить и будет зависеть от вашей конкретной проблемы.Но я бы не использовал sleep самостоятельно для управления потоками.Вы можете поместить потоки в Executor и позволить ему управлять ими.Вы также можете использовать PriorityQueue для заказа ваших задач.

...