[英]How to Change priority process
我有
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();
如何在Java中將進程優先級從“高”設置為“低”?
用Java無法設置進程的優先級。
僅線程優先。
但是您可以使用系統命令以指定的優先級運行進程:
Linux: new ProcessBuilder("nice", "-n", "10", "somecommand", "arg1", "arg2");
Windows: new ProcessBuilder("cmd", "/C start /B /belownormal /WAIT javaws -sdasd");
這取決於平台,我為Windows實現了這一點:
您首先需要創建的進程的句柄,然后使用JNI更改進程的優先級:
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);
}
相應的JNI標頭(文件com_example_util_ProcessUtil.h)
#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
JNI實現(文件com_example_util_ProcessUtil.cpp)
#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);
}
確保將本機部分編譯到名為ProcessUtil.dll的庫中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.