Что на самом деле происходит внутри процессора при выполнении потоков? - PullRequest
0 голосов
/ 24 ноября 2018

Я думаю, что я переосмысливаю концепцию потоков в Java, и это может быть глупым вопросом.Я читаю некоторые темы с ответами на темы, но они на самом деле не отвечают на мой вопрос.

Итак, предположим, что у нас есть 3 темы: t1, t2, t3.

метод запуска t1:

thread.sleep(1000);
System.out.println("Hello");

метод запуска t2:

System.out.println("Hi");

метод запуска t3:

thread.sleep(3000);
System.out.println("Bye");

t1.start ();

t2.start ();

t3.start ();

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

Кроме того, предположим, что сначала запланировано t1, что означает, что он получает процессорное время, а затем переходит в спящий режим на 1000 мс, как в приведенном выше коде.Теперь предположим, что t2 получает процессорное время, и, поскольку он не спит, он печатает «Привет».Теперь t3 получает время процессора, оно спит 3000 мс, поэтому t1 снова получает время процессора.Итак, теперь t1 поднимается с того места, где он ушел раньше?Что если t1 все еще спит, потому что 1000 мс не прошло с прошлого раза?

Возможно, я неправильно понял, но я жонглирую этими понятиями.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

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

Большинство современных ЦП могут одновременно запускать более одного потока.Если ЦП фактически не может запустить столько потоков параллельно, сколько потоков, которые хотят работать, планировщик примет решение о том, как долго запускать каждый поток.Как правило, он выбирает время, которое достаточно короткое, чтобы позволить работе чувствовать себя плавно, но не переключаться так часто, что снижение затрат на переключение потоков существенно влияет на производительность.

Кроме того, предположим, что t1 запланировано первым, значитон получает процессорное время, затем переходит в спящий режим на 1000 мс, как в приведенном выше коде.

Когда поток переходит в спящий режим, он больше не готов к работе.

Теперь предположим, что t2 получает процессорное время, и, поскольку он не спит, он печатает «Привет».Теперь t3 получает время процессора, оно спит 3000 мс, поэтому t1 снова получает время процессора.Итак, теперь t1 поднимается с того места, где он ушел раньше?Что если t1 все еще спит, потому что 1000 мс не прошло с прошлого раза?

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

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

0 голосов
/ 24 ноября 2018

Потоки являются подразделениями процесса и совместно используют одно и то же пространство памяти.Планировщик решает, какой поток отправляется на выполнение.И это так зависит.

Вы можете найти больше информации здесь: https://www.javamex.com/tutorials/threads/how_threads_work.shtml

...