设置 Java 线程的优先级
-
06-07-2019 - |
题
我有一个在几个线程中运行的程序。主线程与其他线程共享一个对象,在主线程中我调用了:
synchronized(obj){
do stuff
}
我怀疑主线程饥饿并且无法访问 obj
. 。如何提高主线程的优先级或者默认情况下它已经高于其他线程?
解决方案
Thread类中有一个setPriority()方法。
检查此javadoc 。
将线程优先级设置为最大值:
public static void main(String args[]) {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
// Your main code.
}
其他提示
一系列文章此处表明了线程优先级管理的一些复杂性在各种平台上。
我想知道你的根本问题是你的工作线程是否非常占用CPU,因此很少能达到他们自然会“放手”的程度。处理器(例如通过做一些IO或休眠)。如果是这种情况,那么你可能会在这些worker中包含对yield()的一些调用,因此给其他Thread更多的机会。
您可以使用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 );
增加主线程的优先级的方式玛卡瑟 说可能会起作用。但是,您依赖平台的抢占式线程调度程序才能正常工作。你应该改为调用 Thread.yield()
当工作线程完成正在运行的任何重要代码部分时,在工作线程中使用静态方法。即使您使用不同级别的线程优先级,这也是一个值得养成的好习惯。
正如其他人已经回答的那样,您确实可以为线程设置优先级,如下所示:
Thread.currentThread().setPriority(priority);
但请注意,在您的示例中,该线程优先级与线程访问同步对象的顺序无关。 Java使用其他条件来提供访问权限。 例如,请参见此。
不隶属于 StackOverflow