2009-10-24 3 views
23

У меня есть программа, которая работает в нескольких потоках. Основной поток разделяет объект с другими нитями и в основном у меня есть вызов:Установка приоритета на потоки Java

synchronized(obj){ 
    do stuff 
} 

У меня есть подозрение, что основной поток голодал и не получает доступ к obj. Как повысить приоритет основного потока или он уже выше, чем другие потоки по умолчанию?

+1

Macarse уже рассмотрел, как изменить приоритет, но, возможно, вы можете вставить еще один код. Возможно, что-то еще не так, или способ заставить другие потоки тратить меньше времени на синхронизацию с obj. –

+0

как установить приоритет среди 20 потоков, так как приоритет потока от 1 до 10, так что это означает, что только 9 потоков могут быть заданы приоритеты .... ?? – anshulkatta

ответ

35

У вас есть метод setPriority() в классе Thread.

Проверьте this javadoc.

Настройка приоритет потока до максимального значения:

public static void main(String args[]) { 
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY); 
    // Your main code. 
} 
+0

, так что вы говорите - в каждом потоке я создаю setPriority (минимум). Есть ли способ, которым вы знаете, чтобы установить приоритет основного потока на максимум? и это имеет значение? – Guy

+0

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

+3

как установить приоритет среди 20 потоков, так как приоритет потока от 1 до 10, так что это означает, что только 9 потоков могут быть заданы приоритеты .... ?? – anshulkatta

9

В серии статей here показаны некоторые сложности в управлении приоритетами потоков на разных платформах.

Интересно, ваша основная проблема заключается в том, что ваши рабочие потоки очень интенсивно работают на процессоре и, следовательно, редко достигают точки, где они, естественно, «отпустили» процессор (например, выполнив IO или спящий режим.) Если такое в этом случае вы могли бы включить некоторые вызовы to yield() в этих рабочих, следовательно, дать другим Threads больше шансов.

5

вы можете использовать метод SetPriority(). Например:

new MyThread("Foo").start(); 
Thread bar = new MyThread("Bar"); 
bar.setPriority(Thread.NORM_PRIORITY + 1); 
bar.start(); 

Это дает преградить новый приоритет, который должен быстро взять на себя Foo

Edit:

Чтобы ответить на комментарий, вы можете установить максимальную priortiy с помощью:

bar.setPriority(Thread.MAX_PRIORITY); 
+0

, но вы устанавливаете MAX_PRIORITY для потока, а не для основного потока. – Guy

+0

просто установите нить, которую вы мне хотите, мин до MIN_PRIORITY и т. Д. ... – northpole

3

Увеличение приоритета основной нити Macarse говорит, что, вероятно, будет работать. Тем не менее, вы полагаетесь на планировщик приоритетных потоков платформы для правильной работы. Вместо этого вы должны называть статический метод Thread.yield() в ваших рабочих потоках, когда они выполняются с любыми важными разделами кода, в котором они работают. Это хорошая привычка вступать, даже если вы используете разные уровни приоритета потока.

0

Как и другие уже ответили, вы действительно можете установить приоритет нити следующим образом:

Thread.currentThread().setPriority(priority); 

Но следует помнить, в вашем примере, что приоритет потока не имеет ничего общего, в каком порядке нити получить доступ к синхронизированному объекту. Java использует другие критерии для доступа. См., Например, this.

Смежные вопросы