[英]java Process.waitfor is a blocking call
我希望能夠從JVM中啟動外部進程並完成它。
我可以使用ProcessBuilder創建一個Process,然后使用Process.waitFor()來等待它的完成。 但是,這是一個阻塞調用,只是浪費線程資源。
通過事件處理程序和反應式編程來實現這一點會更有意義。 有人會認為JVM可以通過操作系統注冊某種監聽器來監聽進程完成事件,並將其轉發回程序。
這樣的機制/ API是否存在? 實現這一目標的任何替代品或庫?
如果您只需要支持Windows,MacOS X和Linux,請使用NuProcess庫。 它使用回調模型提供對外部進程的非阻塞訪問 - 包括I / O和程序終止。 披露:我是該庫的作者。
生成將等待進程完成的新線程:
final Process process = ...;
new Thread(new Runnable() {
@Override
public void run() {
try {
process.waitFor();
} catch (InterruptedException e) {
// thread is interrupted, check process state
}
// signal main thread
}
}).start();
或者使用Executors:
Future<String> future = Executors.newSingleThreadExecutor().submit(new Callable<String>() {
@Override
public String call() throws Exception {
process.waitFor();
return "OK";
}
});
后來允許你通過未來API檢查作業狀態: future.isDone()
future.cancel()
,...
有人會認為JVM可以通過操作系統注冊某種監聽器來監聽進程完成事件,並將其轉發回程序。
只有當一個java的所有目標操作系統都支持這樣的機制時。 你有證據證明他們有嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.