我有一个在几个线程中运行的程序。主线程与其他线程共享一个对象,在main中我有一个调用:
synchronized(obj){
do stuff
}
我怀疑主线程已经饿死,无法访问obj
。如何提高主线程的优先级,或者默认情况下它是否已经高于其他线程?
答案 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。