Java 如何更改优先级流程

Java 如何更改优先级流程,java,windows,process,ffmpeg,processbuilder,Java,Windows,Process,Ffmpeg,Processbuilder,我有 List命令=Arrays.asList(commandv); ProcessBuilder pb=new ProcessBuilder(“[C:\ffmpeg\ffmpeg.exe,-i,,[C:\file\video.mp4“,-flags,+loop,-cmp,+chroma,-partitions,+part4x4+partp8x8+partb8x8,-me_方法,umh,-subq,6,-me_范围,16,-g,250,-keyint_min,25,-sc_阈值,40,-i_因子

我有

List命令=Arrays.asList(commandv);
ProcessBuilder pb=new ProcessBuilder(“[C:\ffmpeg\ffmpeg.exe,-i,,[C:\file\video.mp4“,-flags,+loop,-cmp,+chroma,-partitions,+part4x4+partp8x8+partb8x8,-me_方法,umh,-subq,6,-me_范围,16,-g,250,-keyint_min,25,-sc_阈值,40,-i_因子,0.71,-b_策略,1,-threads,4,-b:v,200k,-r,25,-v,警告,-ac,1,-ab,96k,-y,-vf,“scale=640 360”,“C:\newVideo\video.mp4”]”;
processproc=pb.start();

如何在java中将进程优先级从“高”设置为“低”?

在java中无法设置进程优先级。
仅线程优先级。
但您可以使用系统命令以指定的优先级运行进程:
Linux:
新的ProcessBuilder(“nice”、“n”、“10”、“somecommand”、“arg1”、“arg2”);


Windows:
newProcessBuilder(“cmd”,“C start/B/belownormal/WAIT javaws-sdasd”);

这取决于平台,我为Windows实现了以下功能:

您首先需要创建流程的句柄,然后使用JNI更改流程的优先级:

   List<String> commands = Arrays.asList(commandv);
   ProcessBuilder pb = new ProcessBuilder("[C:\ffmpeg\ffmpeg.exe, -i, "C:\file\video.mp4",-flags, +loop, -cmp, +chroma, -partitions, +parti4x4+partp8x8+partb8x8, -me_method, umh, -subq, 6, -me_range, 16, -g, 250, -keyint_min, 25, -sc_threshold, 40, -i_qfactor, 0.71, -b_strategy, 1, -threads, 4, -b:v, 200k, , -r, 25, -v, warning, -ac, 1, -ab, 96k, -y, -vf, "scale=640:360", "C:\newVideo\video.mp4"]");
   Process proc = pb.start();
对应的JNI头(文件com\u example\u util\u ProcessUtil.h)

#包括
#ifndef包括com示例util进程util
#定义\u包含\u com\u示例\u util\u ProcessUtil
#ifdef_uucplusplus
外部“C”{
#恩迪夫
JNIEXPORT void JNICALL Java_com_示例_util_ProcessUtil_changePrioToLow
(JNIEnv*,jclass,jlong);
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫
JNI实现(文件com\u example\u util\u ProcessUtil.cpp)

#包括
#定义_WIN32_WINNT 0x0501
#包括
#包括“com\u example\u util\u ProcessUtil.h”
JNIEXPORT void JNICALL Java_com_示例_util_ProcessUtil_changePrioToLow
(JNIEnv*env,忽略jclass,jlong句柄){
SetPriorityClass((句柄)句柄,空闲\u优先级\u类);
}
确保将本机部件编译到名为ProcessUtil.dll的库中

package com.example.util;

import java.lang.reflect.Field;

public class ProcessUtil {

    static {
        try {
            System.loadLibrary("ProcessUtil");
        }
        catch (Throwable th) {
            // do nothing
        }
    }

    public static void changePrioToLow(Process process) {
        String name = process.getClass().getName();
        if (!"java.lang.ProcessImpl".equals(name)) {
            return;
        }
        try {
            Field f = process.getClass().getDeclaredField("handle");
            f.setAccessible(true);
            long handle = f.getLong(process);
            f.setAccessible(false);
            changePrioToLow(handle);
        }
        catch (Exception e) {
            // do nothing
        }
    }

    private static native void changePrioToLow(long handle);
}
#include <jni.h>

#ifndef _Included_com_example_util_ProcessUtil
#define _Included_com_example_util_ProcessUtil
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT void JNICALL Java_com_example_util_ProcessUtil_changePrioToLow
    (JNIEnv *, jclass, jlong);

#ifdef __cplusplus
}
#endif
#endif
#include <jni.h>
#define _WIN32_WINNT 0x0501
#include <windows.h>
#include "com_example_util_ProcessUtil.h"

JNIEXPORT void JNICALL Java_com_example_util_ProcessUtil_changePrioToLow
    (JNIEnv *env, jclass ignored, jlong handle) {

    SetPriorityClass((HANDLE)handle, IDLE_PRIORITY_CLASS);
}