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

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使用其他条件来提供访问权限。 例如,请参见

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top