设置Java线程的优先级

Guy*_*Guy 27 java multithreading thread-priority

我有一个程序,运行在几个线程中.主线程与其他线程共享一个对象,在main中我有一个调用:

synchronized(obj){
    do stuff
}
Run Code Online (Sandbox Code Playgroud)

我怀疑主线程是饿死的,无法访问obj.如何提高主线程的优先级或默认情况下它是否已高于其他线程?

Mac*_*rse 44

Thread类中有一个setPriority()方法.

检查这个javadoc.

将线程优先级设置为最大值

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

  • @ ylun.ca优先级只是相对的.给予一切最高优先级与给予一切最低优先级相同. (5认同)
  • 如何在20个线程中设置优先级,因为线程优先级是1-10,这意味着只有9个线程可以给予优先级.... (4认同)
  • @anshulkatta否.您可以为多个线程提供相同的优先级.请记住:优先级只是一个提示.它不一定有任何承诺.如果您需要超过3个优先级,那么您可能过度工程. (4认同)

djn*_*jna 9

该系列文章在这里显示了一些在各种平台上的线程优先级的管理复杂性.

我想知道你的基本问题是否只是你的工作线程非常占用CPU,因此很少达到他们自然会"放开"处理器的程度(例如通过做一些IO或睡眠.)如果是这样的话那么你可能会在这些worker中包含对yield()的一些调用,因此给其他Thread更多的机会.


nor*_*ole 5

你可以使用setPriority()方法.例如:

new MyThread("Foo").start(); 
Thread bar = new MyThread("Bar"); 
bar.setPriority( Thread.NORM_PRIORITY + 1 ); 
bar.start();
Run Code Online (Sandbox Code Playgroud)

这给了新的优先权,应该迅速接管Foo

编辑:

要回答您的评论,您可以使用以下方法设置max priortiy:

bar.setPriority( Thread.MAX_PRIORITY );
Run Code Online (Sandbox Code Playgroud)