在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的方式来改变当前的进程优先级?理想情况下,能够在程序运行时更改进程的优先级以响应用户输入。
答案 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。