设置Java线程的优先级

时间:2009-10-24 13:04:39

标签: java multithreading thread-priority

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

synchronized(obj){
    do stuff
}

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

5 个答案:

答案 0 :(得分:44)

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

检查this javadoc

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

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

答案 1 :(得分:9)

一系列文章here表明在各种平台上管理线程优先级有些复杂。

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

答案 2 :(得分:5)

您可以使用setPriority()方法。例如:

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

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

编辑:

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

bar.setPriority( Thread.MAX_PRIORITY );

答案 3 :(得分:3)

增加主线程的优先级 Macarse 说可能会奏效。但是,您依靠平台的抢占式线程调度程序才能正常工作。您应该在工作线程中使用Thread.yield()静态方法调用它们正在运行的任何重要代码段。即使您使用不同级别的线程优先级,这也是一个很好的习惯。

答案 4 :(得分:1)

正如其他人已经回答的那样,您确实可以为线程设置优先级,如下所示:

object(stdClass)#1 (0) { }

但请注意,在您的示例中,该线程优先级与线程访问同步对象的顺序无关。 Java使用其他条件来提供访问权限。 请参阅示例this