Подтвердить что ты не робот

Установка приоритета для потоков Java

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

synchronized(obj){
    do stuff
}

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

4b9b3361

Ответ 1

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

Отметьте этот javadoc.

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Edit:

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

bar.setPriority( Thread.MAX_PRIORITY );

Ответ 4

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

Ответ 5

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

Thread.currentThread().setPriority(priority);

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