跨平台改变Java进程优先级的方法

8

我需要从另一个Java应用程序中的单独JVM中调用.jar文件,并且这很耗费CPU资源,因此它应该以后台优先级运行,以避免影响系统的其余部分。是否有任何跨平台的方法来做到这一点?


以“编写一次,到处运行”跨平台的意义来看,不是的。但是编写一小段非可移植代码,让它在每台Un*x机器(包括OS X)和每台Windows机器上都能工作,确实并不难。支持Stephen C的回答。 - SyntaxT3rr0r
2个回答

3
简单的回答是,在Java中没有可移植的方法来改变进程的优先级。(线程可以,进程不行。)
如果你的Java应用程序需要启动一个新的JVM来运行CPU密集型应用程序,那么很有可能它已经不完全可移植了。例如,你通常需要给出java命令(或等效命令)的路径名,一个-cp参数(或等效参数),系统特定的JVM选项等等。
因此,假设启动JVM的命令已经是非可移植的,那么如果你用一个包装脚本替换这个命令,并做一些特定于操作系统的事情来改变启动进程的优先级,应该并不重要。(例如,在UNIX或Linux上,你可以使用nice来启动JVM。)

1

我不知道如何为外部进程设置优先级。然而,Thread 类有一个 setPriority 方法,所以如果你控制目标应用程序,你可以尝试添加一个开关,告诉应用程序将自己的优先级设置为最低:

theThread.setPriority(Thread.MIN_PRIORITY);

如果它仍然影响系统,我建议您交错一些短的sleep以卸载CPU。

另一种选择:

如果您将目标.jar放置在“启动”应用程序的类路径中,您可以在新创建的线程中简单地调用jar文件的main方法,然后使用上述方法设置优先级。(即使您不控制目标jar文件的源代码,这也应该起作用。)


1
我理解他需要生成另一个进程,而这个方法是为线程设计的,所以我认为它不会起作用... - Persimmonium
哦.. 嗯.. 很好的观点。我想,只有在执行程序时有可能添加一个开关时,这才有意义。 - aioobe
如果他拥有正在运行的另一个进程的源代码,它就可以将自己设置为MIN_PRIORITY,对吗? - Dean J
1
@Dean J - 这只影响线程的优先级。进程优先级是一个不同的概念。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接