为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使用其他标准来授予访问权限。 看这个例子。