Как работает Thread.sleep () при вызове из нескольких потоков

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

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

7
задан JWhiz 21 August 2010 в 06:26
поделиться

5 ответов

как он определяет ток поток исполнения?

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

7
ответ дан 6 December 2019 в 22:59
поделиться

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 ()

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

-1
ответ дан 6 December 2019 в 22:59
поделиться

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

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

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

Таким образом, ему не нужно выяснять, что такое текущий поток. 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;
-1
ответ дан 6 December 2019 в 22:59
поделиться

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

6
ответ дан 6 December 2019 в 22:59
поделиться

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

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

0
ответ дан 6 December 2019 в 22:59
поделиться
Другие вопросы по тегам:

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