0

何かが足りないので、呼び出し可能に基づいてcalsを作成し、GUIでインスタンスを作成し、アクションが実行されたときにそれを呼び出しました。唯一のことは、プロセスが同じスレッドで実行されているためGUIが応答せず、GUIにアクセスする前にプロセスが終了するのを待たなければならないことです。コードの一部を次に示します。

public class MYProject {
public static class CreateProject implements Callable<Boolean>{
    private String m_url;
    private String m_project;
    private String m_options;
    public CreateProject(String url, String project, String options){
        m_url = url;
        m_project = project;
        m_options = options;
    }
    public Boolean call(){
        Boolean result = true;
        try {
            if (os.toLowerCase().contains("windows")){
                command = windowsCMD + command;
            }
            String line;
            Process p = Runtime.getRuntime().exec(command);
            InputStreamReader isr = new InputStreamReader(p.getInputStream());
            BufferedReader bri = new BufferedReader(isr);
            try {
                while ((line = bri.readLine()) != null) {
                    if(line.startsWith("ERROR")){
                        System.out.println(line);
                        result = false;
                        break;
                    }
                }
                p.waitFor();
            }
            finally {
                bri.close();
            }
        }
        catch (Exception err) {
            System.err.println("Unable to create project: " + err.getMessage() 
                                + "\n");
            result = false;
        }
        return result;
    }
}
}

およびGUIで:

private void jButtonRefreshActionPerformed(java.awt.event.ActionEvent evt) {
    jTextAreaConsole.append("Creating project.\n");
    MYProject.CreateProject blah = new MYProject.CreateProject("url", "project", "options");
    String result = blah.call();
    jTextAreaConsole.append("Project creation successful: " + result);
}

結果として、プロセスpはGUIと同じスレッドで実行され、クリックできるものはなく、jTextAreaConsoleはプロセスが終了するまで更新されません。誰かが私がこれをどのように実装すべきかについてアドバイスを提供できますか?

4

3 に答える 3

3

SwingWorker実行時間の長いタスク用に を実装します。詳細については、Swingでの同時実行を参照してください。

于 2012-12-13T16:16:42.667 に答える
2

その結果、Process p は引き続き GUI と同じスレッドで実行され、何もクリックできず、jTextAreaConsole が

はい、まさに p.waitFor(); を実行しています。あなたのコードで

waitFor()

この Process オブジェクトによって表されるプロセスが終了するまで、必要に応じて現在のスレッドを待機させます。

から

プロセス クラス

@Andrew Thompson が投稿したように SwingWorker を使用することも、Runnable の run メソッドを実装して新しいスレッドで開始することもできます。または、@hoaz が投稿したように Executor クラスを使用することもできます。

callable を別のスレッドで実行するには、 Executors を使用する必要があります

于 2012-12-13T16:10:37.950 に答える
0

インスタンスを個別Executorに実行するには、を使用する必要があります。CallableThread

Executor executor = Executors.newSingleThreadExecutor();
executor.submit(blah);
...
executor.shutdown(); // free resources

一度エグゼキュータを作成し、プログラムの終了時に破棄する必要があることに注意してください。そうしないと、リソースがリークする可能性があります。

于 2012-12-13T15:59:12.370 に答える