有一个应该运行得非常快的方法。程序的速度并不重要,唯一重要的是调用以下代码的方法很快。我有两个选项,第一个是我打开一个新的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();
}
发布于 2018-10-31 10:07:04
创建新线程1以执行任务比执行任务要慢。
但是,通常,在单独的线程上执行任务在质量上是不同的。它允许当前线程执行其他操作而不是等待任务完成。
但是#2,您在这里执行的具体任务是:
new ProcessBuilder("cmd", "/c", program.getAbsolutePath()).start();
它启动一个外部进程来运行程序,而不是等待它完成。这不太可能阻塞可观的时间2,因此在单独的线程中执行此操作几乎没有(如果有的话)优势。
1 - 使用现有线程(例如,通过ExecutorService
实例管理的线程池)将更快。但即便如此,也不清楚这样做是否值得付出努力。
2 - 评论者指出a Process
不需要与启动它的线程异步运行。实际上,启动进程可能会阻塞线程或整个JVM。在具有多个内核的典型现代平台上,这不太可能。在具有单核的平台上,启动第二个线程可能会导致第一个线程被挂起...因此您仍然可能无法执行异步执行。
https://stackoverflow.com/questions/-100005106
复制相似问题