Вопрос

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

synchronized(obj){
    do stuff
}

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

Это было полезно?

Решение

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

Проверьте этот javadoc . р>

Установка приоритета потока на максимум:

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

Другие советы

Серия статей здесь указывает на некоторые сложности в управлении приоритетами потоков на разных платформах.

Интересно, ваша основная проблема заключается просто в том, что ваши рабочие потоки сильно нагружают ЦП и, следовательно, редко достигают точки, когда они естественным образом "отпустят"? процессора (например, выполняя некоторый ввод-вывод или спящий режим). Если это так, то вы можете включить некоторые вызовы yield () в этих рабочих, что даст другим потокам больше шансов.

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

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

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

Редактировать:

Чтобы ответить на ваш комментарий, вы можете установить максимальный приоритет, используя:

bar.setPriority( Thread.MAX_PRIORITY );

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

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

Thread.currentThread().setPriority(priority);

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top