为Java的线程设置优先级

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

synchronized(obj){ do stuff } 

我有一个怀疑,主线程饿死,并没有获得访问obj 。 我如何提高主线程的优先级或者默认情况下已经高于其他线程?

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

检查这个javadoc 。

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

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

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

我不知道你的根本问题是否只是你的工作线程是CPU密集型的,因此很less达到他们自然地放弃处理器的地步(例如通过做一些IO或睡觉)。如果是这样的话,那么你可能会在这些工作者中包含一些调用yield(),从而给其他线程更多的机会。

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

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

这给了吧应该迅速接pipeFoo的新的优先权

编辑:

要回答您的评论,您可以使用以下设置来设置最高优先级:

 bar.setPriority( Thread.MAX_PRIORITY ); 

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

正如其他人已经回答,你确实可以设置一个线程的优先级如下:

 Thread.currentThread().setPriority(priority); 

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