我有一个方法,应该运行得非常快。程序的速度并不重要,唯一重要的是调用以下代码的方法要快。我有两个选择,第一个是我打开一个新的Thread,第二个是直接运行该方法。
选项一:
new Thread(() -> executeProgram(programs.get("progname"))).start();
选项二:
executeProgram(programs.get("progname.jar"));
“ executeProgram”方法是这样的:
private void executeProgram(File program){
try {
new ProcessBuilder("cmd", "/c", program.getAbsolutePath()).start();
} catch (IOException e) {
e.printStackTrace();
}
}
创建新线程1来执行任务比仅执行任务要慢。
但是,通常,在单独的线程上执行任务在质量上是不同的。它允许当前线程执行其他操作,而不是等待任务完成。
但是,#2,您在此处执行的特定任务是:
new ProcessBuilder("cmd", "/c", program.getAbsolutePath()).start();
它启动一个外部进程来运行程序,而不等待它完成。这不太可能在相当长的时间2内阻塞,因此在单独的线程中执行此操作几乎没有优势(如果有的话)。
1-使用现有线程(例如,通过ExecutorService
实例管理的线程池)将更快。但是即使这样,仍不清楚是否值得为此付出努力。
2-评论者指出,Process
不需要a 与启动它的线程异步运行。实际上,启动进程可能会阻塞线程或整个JVM。在具有多个内核的典型现代平台上,这是不太可能的。在具有单核的平台上,启动第二个线程可能会导致第一个线程挂起……因此您仍然可能无法获得异步执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句