2017-01-02 25 views
0

在我的Java程序,我開始它修改系統剪貼板內容的外部.jar文件。之後,我繼續寫入剪貼板的數據。不幸的是,它看起來像罐子得到啓動,程序不等到罐子執行完畢。等待,直到所謂的罐子執行完畢

這裏是我用來啓動jar文件的代碼:

import java.io.IOException; 

public class JarExecutor { 

    private String pathToJar = ""; 
    private String jarFile = ""; 
    private String pathToJava = "C:\\ProgramData\\Oracle\\Java\\javapath\\javaw.exe"; 

    public JarExecutor(String pathToJar, String jarFile) { 
     this.pathToJar = pathToJar; 
     this.jarFile = jarFile; 
    } 

    public void execute() { 

     ProcessBuilder pb = new ProcessBuilder(pathToJava, "-jar", pathToJar + jarFile); 
     try { 
      Process p = pb.start(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

,距離主要程序是:

public static void main(String[] args) { 
     String pathToJar = "\\\\some\\net\path"; 
     String jarFile = "externalProgram.jar"; 

     JarExecutor myExecutor = new JarExecutor(pathToJar, jarFile) 
     myExecutor.execute(); 

     [...] 
} 

只要我把用毫秒Thread.sleep(ms)> 3000後myExecutor.execute()在我的程序它的工作原理,但我想這是不正確的方式來等待完成其他進程。

+0

你有沒有考慮使用gradle這個呢?您可以執行外部Java進程很好那裏,你可以把你自己的代碼那裏。如果這可能適合你,我可以用示例和對文檔的引用來準備答案。 –

回答

4

Process documentation右有:

waitFor

public abstract int waitFor() 
throws InterruptedException 

造成當前線程如果需要等待,直到通過此處理對象表示的進程已經終止。如果子進程已經終止,則此方法立即返回。如果子進程還沒有結束,調用線程將被阻止,直到子進程退出。

+0

感謝 現在運行完美。 I'll你的答案添加到我的問題 – Moka

+0

@Moka:不要做,那不是怎麼這麼工作。你做了什麼(標誌着接受的答案)就是你在這裏做的。很高興這有幫助。 –

0

使用waitFor如果你需要main罐子執行完成後,才進行將是完美的解決方案。否則,你會看到某種進程間通信。嘗試使用套接字在進程之間傳遞消息。