3

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

我已经尝试了以下,但它不会改变任务管理器中的进程优先级

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

我能想到的唯一另一件事是使用批处理文件运行程序,但可以这么说,我宁愿把它留在家里。那么有谁知道基于java的方法来改变当前进程的优先级?理想情况下,如果能够在程序运行时响应用户输入来更改进程的优先级,那就太好了。

4

4 回答 4

6

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

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

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

于 2011-06-05T07:33:41.660 回答
3

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

于 2011-06-04T20:34:03.070 回答
1

对于 Windows 10,您仍然可以通过弃用的WMIC 命令将运行进程设置为低优先级:

static void setSelfLowPrio(){
    try {
        Runtime.getRuntime()
                .exec(String.format("wmic process where processid=%d CALL setpriority \"idle\"", ProcessHandle.current().pid()));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

如果“空闲”不足以满足您的流程,您也可以将其设置为“低”或“低于正常”。

于 2021-11-22T12:54:51.680 回答
0

(标题没有专门针对窗口,但标签确实如此。但是我认为了解这些差异可能是相关的。)

一般来说,线程和进程的调度是依赖于内核的特性,几乎没有可移植的方式来做到这一点。事实上,优先级的含义差别很大。例如,在 NT 上,高值 24 表示实时,值 1 表示空闲。在 unix 上则相反:1 是最快的,而较大的值则较慢。

当然,Java 使用.setPriority1(最低)到 10(最高)的范围来抽象这些信息。

还没有指出,但在许多 unix 上的一个相当大的问题是:默认情况下,用户不能提高进程的优先级(即降低 nice 值),即使用户自己之前降低了优先级。

相比之下,在 NT 上,我认为您可以将优先级重新提高到默认优先级。

简而言之:.setPriority可能适用于 Windows,但很可能不适用于 unix。

于 2014-07-02T11:59:23.550 回答