在一个相关的问题中,我们探讨了如何使用ProcessBuilder使用与操作系统相关的命令以低优先级启动外部进程。 我还发现,如果一个父进程是低优先级的,那么它所产生的所有进程都将以低优先级启动。 所以我的新问题是关于以低优先级启动一个java文件(通过双击Windows中的可执行jar),或者在运行期间以编程方式改变它的优先级。 我已经尝试改变线程优先级,但是这对windows进程优先级没有影响。
我已经尝试了以下,但它不会更改任务pipe理器中的进程优先级
public class hello{ public hello(){ try{ Thread.currentThread().setPriority(1); Thread.sleep(10000); }catch(Exception e){e.printStackTrace();} } }
我能想到的另外一件事就是使用batch file来运行程序,但我宁愿把它留在家庭中。 那么有没有人知道基于java的方式来改变当前的进程优先级? 理想情况下,在程序运行时能够响应用户input来改变进程的优先级将是很好的。
https://stackoverflow.com/questions/257859讨论如何在Windows中更改线程的优先级。 我不知道任何Java API要做到这一点,所以你将不得不回到JNI调用Windows API。 在你的鞋子里,我想我会从JNA开始,让你轻松地映射这些函数,或者找到一个现成的Java包装器(如果有的话)。
也许你正试图做一些操作系统为你做的事情。
在Unix中,在负载下,每个进程都有一个短时间片来完成它的工作。 如果它使用所有的时间片,则假定该进程是CPU限制的,则优先级降低。 如果它在IO上被阻塞,则它被假定为IO绑定,并且其优先级被提高(因为它没有使用它的所有时间片)
所有这些只在没有足够的CPU时才重要。 如果大多数情况下CPU负载保持在100%以下,那么每个进程将获得尽可能多的CPU,优先级并没有太大的差别。
(这个标题并不是专门针对windows的,但标签是这样做的,但是我认为它可能是相关的。
在线程的一般调度中,进程是一个与内核相关的特性,几乎没有一种便携的方法来做到这一点。 事实上,优先权的意义各不相同。 例如在NT上,24的高值表示实时值,1表示空闲。 在Unix上这是相反的:1是最快的,较大的值是较慢的。
当然,Java使用.setPriority
将范围从1( 最低 )到10( 最高 )的信息抽象出来。
还没有指出的东西,但是在很多unix上有一个很大的问题是: 默认情况下,即使用户自己降低了优先级,用户也不能增加进程的优先级(即减少nice值)。
相反,在新台币我认为你可以重新优先回到默认优先级。
简单地说: .setPriority
可能在Windows上工作,但很可能不适用于Unix。