我们有一个Java应用程序需要在虚拟(Hyper-V)Windows 2012 R2 Server上运行,以及其他环境.在此虚拟Windows服务器上执行时,似乎遇到了奇怪的计时问题.我们已经将问题跟踪到Java预定执行程序中的不稳定调度:
public static class TimeRunnable implements Runnable {
private long lastRunAt;
@Override
public void run() {
long now = System.nanoTime();
System.out.println(TimeUnit.NANOSECONDS.toMillis(now - lastRunAt));
lastRunAt = now;
}
}
public static void main(String[] args) {
ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
exec.scheduleAtFixedRate(new TimeRunnable(), 0, 10, TimeUnit.MILLISECONDS);
}
Run Code Online (Sandbox Code Playgroud)
此代码应每10ms运行一次TimeRunnable,在服务器上生成如下结果:
12
15
2
12
15
0
14
16
2
12
140
0
0
0
0
0
0
0
0
0
0
0
0
1
0
7
15
0
14
16
2
12 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用ProcessBuilder类通过Java启动外部进程,这很有用.目前正在使用命令运行:
new ProcessBuilder("java", "-jar", jarfile, args);
Run Code Online (Sandbox Code Playgroud)
我想做的就是这样,但要以低优先级开始这个过程.我的程序目前只在Windows上运行,因此我可以使用特定于窗口的解决方案.一些研究建议我使用"start"命令,但是当我尝试从Java执行此操作时,它会给出一个异常,说它是一个无法识别的命令(同样的命令可以从cmd.exe运行).
有没有人知道如何从Java启动进程(特定于Windows,如果需要),具有belownormal优先级?
我对线程有一个小问题.在Unix系统上,我们有nice,可用于设置优先级进程.好的,在我的系统上,我调用了一些外部进程,但是,我想为它们设置优先级.在unix中,我可以调用其他ProcessBuilder并设置好我想要的进程,但在Windows中,它是不可能的.
如果我启动一个具有某些优先级的线程,并在ProcessBuilder中使用它,那么该进程将具有与线程相同的优先级?或者还有其他方法可以做到这一点吗?
干杯