如何更改正在运行的java进程的优先级?

时间:2011-06-04 20:17:11

标签: java windows process windows-scheduler

related question中,我们探索了使用ProcessBuilder以低优先级使用依赖于操作系统的命令启动外部进程。我还发现,如果父进程的优先级较低,那么它生成的所有进程都将以低优先级启动。所以我的新问题是关于以低优先级启动java文件(通过双击Windows中的可执行jar运行)或在运行期间以编程方式更改其优先级。我尝试改变线程优先级,但这对Windows进程优先级没有影响。

我尝试过以下操作,但它不会更改任务管理器中的进程优先级

public class hello{
    public hello(){
        try{
            Thread.currentThread().setPriority(1);
            Thread.sleep(10000);    
        }catch(Exception e){e.printStackTrace();}
    }
}

我能想到的另一件事就是使用批处理文件来运行程序,但我宁愿将其保留在家庭中。那么有谁知道基于java的方式来改变当前的进程优先级?理想情况下,能够在程序运行时更改进程的优先级以响应用户输入。

3 个答案:

答案 0 :(得分:6)

也许你正在尝试做一些操作系统为你做的事情。

在Unix中,在负载下,每个进程都有一个很短的时间片来完成它的工作。如果它使用所有时间片,则假定进程受CPU限制,优先级降低。如果它在IO上阻塞,则假定它是IO绑定并且其优先级被提高(因为它没有使用它的所有时间片)

所有这些只在CPU不足时才有意义。如果在大多数情况下将CPU负载保持在100%以下,那么每个进程都将获得所需的CPU,并且优先级没有太大差别。

答案 1 :(得分:3)

https://stackoverflow.com/questions/257859讨论了如何在Windows中更改线程的优先级。我不知道有任何Java API可以执行此操作,因此您将不得不依靠JNI来调用Windows API。在你的鞋子里,我想我会从JNA开始,它可以让你轻松地映射函数,或者找到一个现成的Java封装器(如果有的话)。

答案 2 :(得分:0)

(标题没有具体说明窗口,但标签没有。但是我认为知道差异可能是相关的。)

在线程的一般调度中,进程是内核相关的功能,几乎没有可移植的方法来执行此操作。事实上,优先级意味着变化很大。例如,在NT上,高值24表示实时,值1表示空闲。在unix上,这是相反的:1是最快的,更大的值更慢。

当然,Java使用范围为1(.setPriority)到10(lowest)的highest来抽取此信息。

尚未指出的东西,但许多unix上的一个相当大的问题是:默认情况下,用户无法增加进程的优先级(即减少漂亮的值),即使用户本身减少了优先权。

相比之下,我认为您可以将优先级重新设置为默认优先级。

简单地说:.setPriority可能适用于Windows,但很可能不适用于unix。