28

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

synchronized(obj){
    do stuff
}

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

4

5 回答 5

46

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

检查这个 javadoc

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

public static void main(String args[]) {
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    // Your main code.
}
于 2009-10-24T13:15:56.533 回答
9

这里的系列文章指出了各种平台上线程优先级管理的一些复杂性。

我想知道您的基本问题是否仅仅是您的工作线程非常占用 CPU 资源,因此很少达到它们自然会“放开”处理器的程度(例如通过执行一些 IO 或休眠)。如果是这样的话,那么您可能会在这些工作人员中包含一些对 yield() 的调用,从而为其他线程提供更多机会。

于 2009-10-24T13:14:10.770 回答
6

您可以使用 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 );
于 2009-10-24T13:17:17.840 回答
3

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

于 2014-04-09T17:50:42.253 回答
1

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

Thread.currentThread().setPriority(priority);

但请注意,在您的示例中,线程优先级与线程访问同步对象的顺序无关。Java 使用其他标准来授予访问权限。例如看这个

于 2016-11-24T09:36:26.943 回答