Как работает Thread.sleep () при вызове из нескольких потоков - PullRequest
7 голосов
/ 21 августа 2010

sleep () - статический метод класса Thread.Как это работает при вызове из нескольких потоков.и как это выяснить текущий поток выполнения.?

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

Ответы [ 5 ]

7 голосов
/ 21 августа 2010

как определить текущий поток выполнения?

Это не обязательно.Он просто вызывает операционную систему, которая всегда спит поток, который вызвал его.

6 голосов
/ 21 августа 2010

Метод sleep спит текущий поток, поэтому если вы вызываете его из нескольких потоков, он будет спать каждый из этих потоков.Также есть статический метод currentThread , который позволяет вам получить текущий исполняемый поток.

0 голосов
/ 21 августа 2010

Когда виртуальная машина встречает заявление sleep(long), она прерывает текущий поток. «Текущий поток» в этот момент всегда является потоком, который вызвал Thread.sleep(). Тогда это говорит:

Эй! Ничего не поделать в этой теме (потому что я должен ждать). Я собираюсь продолжить другую тему.

Смена темы называется "уступить". (Примечание: вы можете сдаться самостоятельно, позвонив по номеру Thread.yield();)

Итак, ему не нужно выяснять, что такое текущий поток. Всегда вызывается Thread, который вызывает sleep (). Примечание: Вы можете получить текущий поток, позвонив Thread.currentThread();

Краткий пример:

// here it is 0 millis
blahblah(); // do some stuff
// here it is 2 millis
new Thread(new MyRunnable()).start(); // We start an other thread
// here it is 2 millis
Thread.sleep(1000);
// here it is 1002 millis

MyRunnable его run() метод:

// here it is 2 millis; because we got started at 2 millis
blahblah2(); // Do some other stuff
// here it is 25 millis;
Thread.sleep(300); // after calling this line the two threads are sleeping...
// here it is 325 millis;
... // some stuff
// here it is 328 millis;
return; // we are done;
0 голосов
/ 21 августа 2010

более общий вопрос: как вызываются статические методы из разных потоков? Не будет ли проблем с параллелизмом?

Существует только потенциальная проблема параллелизма, если один или несколько потоков изменяют общее состояние, в то время как другой поток использует то же состояние. Для метода sleep () нет общего состояния.

0 голосов
/ 21 августа 2010

Thread.sleep(long) изначально реализовано в классе java.lang.Thread. Вот часть документа API:

 Causes the currently executing thread to sleep (temporarily cease 
 execution) for the specified number of milliseconds, subject to 
 the precision and accuracy of system timers and schedulers. The thread 
 does not lose ownership of any monitors.

Метод сна спит в потоке, который его вызвал. (На основе комментариев EJP) определяет текущий исполняющий поток (который вызвал его и заставляет его спать). Методы Java могут определить, какой поток его выполняет по телефону Thread.currentThread()

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

...