簡體   English   中英

java Process.waitfor是一個阻塞調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM