2013-07-24 2 views
5

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

Итак, как мы планируем создавать потоки в Java? В любой момент времени, когда несколько потоков готовы к выполнению, система времени выполнения выбирает поток Runnable с наивысшим приоритетом для выполнения. Если два потока одинакового приоритета ждут CPU, планировщик выбирает один из них для циклического запуска. Что делать, если я не хочу RR? есть ли способ, которым я могу его изменить, или я что-то упустил?

+3

Попытка изменить такие настройки низкого уровня JVM обычно очень плохая идея. В чем проблема, которую вы пытаетесь решить, изменяя порядок выполнения потоков? – ssindelar

ответ

8

Вы не можете изменить алгоритм планирования, поскольку для JVM это не входит в сферу действия. JVM использует потоки пользовательских потоков, предоставляемые базовой ОС.

Итак, с точки зрения Java вы не можете изменить алгоритм планирования. Планирование выполняется автоматически.

Единственное, что можно сделать на Java, это set the priority of the thread. Но как это влияет на алгоритм планирования, не определяется.

Вы можете попробовать изменить алгоритм планирования ОС, на котором работает ваша виртуальная машина. Но это сильно зависит от используемой ОС.

2

В течение последних 10 лет потоки JVM представляют собой потоки системного уровня, а не потоки пользовательского уровня («зеленые»). Даже для потоков пользовательского уровня вы не можете управлять ими (JVM делает).

1

JVM Spec не указывает, как потоки должны планироваться реализацией. Hotspot VM (и, скорее всего, почти каждая другая реализация) использует механизмы планирования ОС (как утверждал Уве). См. Также What is the JVM Scheduling algorithm?.

Простой, но, скорее всего, не очень эффективный способ повлиять на планирование потоков приложений будет иметь только n runnable потоков для ОС, чтобы запланировать (n - количество потоков, которые вы действительно хотели бы запускать параллельно). Это может быть, например, будь то ваша собственная реализация ExecutorService, которая заставляет все потоки, которые вы не хотите планировать ОС, дожидаться, пока вы не подумаете, что они должны запускаться. Конечно, таким образом вы не имеете никакого влияния на другие потоки VM, не говоря уже о других приложениях или ОС.

Более активное участие (а не независимое от платформы) было бы изменить сам планировщик ОС на нечто более приспособленное к потребностям JVM. Быстрое исследование google найдено this abstract, и я предполагаю, что в этом поле сделано больше работы.

0

В Эффективной Java, 2nd Ed., Джошуа Блох посвящает элемент обсуждению планирования потоков. Он подробно рассказывает о том, как пытаться настроить планирование потоков, как правило, приводит только к решениям, зависящим от реализации JVM, не переносным и хрупким.

Если у вас есть определенная проблема с планированием, то для нового кода вы все равно не должны иметь дело с низкоуровневыми потоковыми вызовами. Java имеет библиотеки параллелизма более высокого уровня, которые упрощают многие из этих задач. Вместо того, чтобы определять решение вашей проблемы с помощью потоков, вы должны думать об исполнителях и задачах. Существуют также объекты более высокого уровня, которые упрощают межпоточную связь, например CountDownLatch.

Низкий уровень вызовов потоков, таких как ожидание, уведомление и уведомление. Все может быть сложно сделать правильно.

0

Вы можете написать свой собственный планировщик потоков, аналогичный Quartz job scheduler для пакетных заданий.

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

Если вы хотите определить порядок выполнения потока, выполните код из одного основного потока.