首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用覆盖call()方法和2 ProcessBuilder返回Int

使用覆盖call()方法和2 ProcessBuilder返回Int
EN

Stack Overflow用户
提问于 2022-10-02 08:57:05
回答 1查看 113关注 0票数 1

我想用2 projectB从一个projectA执行一个ProcessBuilder。它可以工作,但我必须先注释一下ProcessBuilder才能执行第二个。

这里是我的第一个代码(只有一个名为F04_C.java的文件)

代码语言:javascript
复制
@FXML
private void executerFichierJava02() {
    System.out.println("");
    System.out.println("method: executerFichierJava02()");
    System.out.println("create 1 Service and 1 Task");
    System.out.println("return 1 ProcessBuilder to");
    System.out.println("execute 1 Java class (from project JavaFX_Test02_Desvstory)");

    final Service<Integer> service01 = new Service<Integer>() {
        
        // override createTask() method
        @Override
        protected Task<Integer> createTask() {
            
            return new Task<Integer>() {
                
                // override call() method
                @Override
                protected Integer call() throws Exception {
                    // first ProcessBuilder
                    ProcessBuilder process01 = new ProcessBuilder("/usr/bin/javac", "-d", "./out", "../JavaFX_Test01_Hello_Devstory/src/module-info.java", "../JavaFX_Test01_Hello_Devstory/src/application/Main.java");
                    // second ProcessBuilder
                    ProcessBuilder process01 = new ProcessBuilder("/usr/bin/java", "-p", "./out", "-m", "JavaFX_Test01_Hello_Devstory/application.Main");
                    
                    return process01
                            .inheritIO()
                            .start()
                            .waitFor();
                }
            };  
        }
    };

    // step start Service
    serviceB = service01;
    serviceB.start();       

}

已经说过:

我不得不评论第一或第二ProcessBuilder,我不能运行程序与两种指令。因此,经过研究,我找到了一个链接,以帮助我实现我的目标。How to return 2 values from a Java method?

它告诉我们创建一个类(最好的方法)来返回我想返回的实例。

因此,使用上面的链接,我编写了一个类来返回2 ProcessBuilder

我向您展示了类文件和更新的F04_C.java文件。

代码语言:javascript
复制
package application.model;

public class ClassPB {
    
    //
    private ProcessBuilder pb01 = new ProcessBuilder();
    private ProcessBuilder pb02 = new ProcessBuilder();
    
    // constructeur(s)
    public ClassPB(ProcessBuilder p_pb01, ProcessBuilder p_pb02) {
        this.pb01 = p_pb01;
        this.pb02 = p_pb02;
    }
    
    // getter(s)
    public ProcessBuilder getPB01() {
        return this.pb01;
    }
    
    public ProcessBuilder getPB02() {
        return this.pb02;
    }
}

更新的F04_C.java

代码语言:javascript
复制
@FXML
private void executerFichierJava02() {
    System.out.println("");
    System.out.println("method: executerFichierJava02()");
    System.out.println("create 1 Service and 1 Task");
    System.out.println("return 1 ProcessBuilder to");
    System.out.println("execute 1 Java class (from project JavaFX_Test02_Desvstory)");

    final Service<Integer> service01 = new Service<Integer>() {
        
        // override createTask() method
        @Override
        protected Task<Integer> createTask() {
            
            return new Task<Integer>() {
                
                // override call() method
                @Override
                protected Integer call() throws Exception {
                    
                    ClassPB pbCombines = something();
                    return pbCombines;  
                }
            };
        }
    };

    serviceB = service01;
    serviceB.start();       
        
}

public static ClassPB something() {
    ProcessBuilder pb01 = new ProcessBuilder("/usr/bin/javac", "-d", "./out", "../JavaFX_Test01_Hello_Devstory/src/module-info.java", "../JavaFX_Test01_Hello_Devstory/src/application/Main.java");
    ProcessBuilder pb02 = new ProcessBuilder("/usr/bin/java", "-p", "./out", "-m", "JavaFX_Test01_Hello_Devstory/application.Main");
    
    try {
        pb01
        .inheritIO()
        .start()
        .waitFor();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    try {
        pb02
        .inheritIO()
        .start()
        .waitFor();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    return new ClassPB(pb01, pb02);
}

但是现在我有一个问题:我必须返回一个Integer,我不知道如何解决这个问题。有什么建议线索吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-10-03 09:58:52

好吧,我自己回答。

我找到了一个解决方案,也许不是一个很好的解决方案,但它有效。

类文件ClassPB没有更改,我也没有发布它。

我将F04_C.java文件更改如下:

  • 创建名为" state“的作用域类变量
  • 创建回调以了解service01
  • 的状态" state”类变量跟随service01状态并为service01
  • 的每个状态获取值“state”变量的值在服务(任务)

中返回

以下是代码:

代码语言:javascript
复制
@FXML
    private void executerFichierJava02() {
        
        final Service<Integer> service01 = new Service<Integer>() {
            
            // --- step 03, override createTask() method
            @Override
            protected Task<Integer> createTask() {
                
                return new Task<Integer>() {
                    
                    // --- step 04, override call() method
                    @Override
                    protected Integer call() throws Exception {
                        
                        ClassPB pbCombines = retourner2ProcessBuilder("/usr/bin/javac",
                                                        "-d",
                                                        "./out",
                                                        "../JavaFX_Test01_Hello_Devstory/src/module-info.java",
                                                        "../JavaFX_Test01_Hello_Devstory/src/application/Main.java",
                                                        "/usr/bin/java",
                                                        "-p",
                                                        "./out",
                                                        "-m",
                                                        "JavaFX_Test01_Hello_Devstory/application.Main");
                                                
                        // state class variable scope to follow
                        // state of service01
                        // if everything is okay, setted to 1, 2 then 3
                        return state;
                    }
                    
                };
                
            }
            
        };
        
        service01.setOnReady(event -> {
            // not displayed into console
            System.out.println("service 01 ready");
            System.out.println("value of state: " + state);
            System.out.println("value of getException(): " + service01.getException());
            System.out.println("value of getValue(): " + service01.getValue());
            
        });
        service01.setOnScheduled(event -> {
            System.out.println("service 01 scheduled");
            state = 1;
            System.out.println("value of state: " + state);
            System.out.println("value of getException(): " + service01.getException());
            System.out.println("value of getValue(): " + service01.getValue());
        });
        service01.setOnRunning(event -> {
            System.out.println("service 01 running...");
            state = 2;
            System.out.println("value of state: " + state);
            System.out.println("value of getException(): " + service01.getException());
            System.out.println("value of getValue(): " + service01.getValue());
        });
        service01.setOnSucceeded(event -> {
            System.out.println("service 01, state, success");
            System.out.println("service 01, state, finished");
            state = 3;
            System.out.println("value of state: " + state);
            System.out.println("value of getException(): " + service01.getException());
            System.out.println("value of getValue(): " + service01.getValue());
        });
        service01.setOnFailed(event -> {
            System.out.println("service 01, state, failed");
            System.err.println("service failed");
            state = 4;
            System.out.println("value of state: " + state);
            service01.getException().printStackTrace();
            System.out.println("value of getException(): " + service01.getException());
            System.out.println("value of getValue(): " + service01.getValue());
        });
        service01.setOnCancelled(event -> {
            System.out.println("service 01, state, cancelled");
            state = 5;
            System.out.println("value of state: " + state);
            System.out.println("value of getException(): " + service01.getException());
            System.out.println("value of getValue(): " + service01.getValue());
        });
        
        // --------------------------------------------------------
        
        // start Service
        
        serviceB = service01;
        serviceB.start();       
        
    }
    
    // =======================================================
    
    // methode 07C
    public static ClassPB retourner2ProcessBuilder(String p01,
                                    String p02,
                                    String p03,
                                    String p04,
                                    String p05,
                                    String p06,
                                    String p07,
                                    String p08,
                                    String p09,
                                    String p10) {
        // ProcessBuilder pb01 = new ProcessBuilder("/usr/bin/javac", "-d", "./out", "../JavaFX_Test01_Hello_Devstory/src/module-info.java", "../JavaFX_Test01_Hello_Devstory/src/application/Main.java");
        ProcessBuilder pb01 = new ProcessBuilder(p01, p02, p03, p04, p05);
        
        // ProcessBuilder pb02 = new ProcessBuilder("/usr/bin/java", "-p", "./out", "-m", "JavaFX_Test01_Hello_Devstory/application.Main");
        ProcessBuilder pb02 = new ProcessBuilder(p06, p07, p08, p09, p10);
        
        try {
            pb01
            .inheritIO()
            .start()
            .waitFor();
        } catch (InterruptedException except) {
            except.printStackTrace();
        } catch (IOException except) {
            except.printStackTrace();
        }
        
        try {
            pb02
            .inheritIO()
            .start()
            .waitFor();
        } catch (InterruptedException except) {
            except.printStackTrace();
        } catch (IOException except) {
            except.printStackTrace();
        }
        
        return new ClassPB(pb01, pb02);
    }

我试着说清楚我的英语。我希望你能理解,因为我翻译了几个句子。

retourner2ProcessBuilder()有10个args:

5用于第一次ProcessBuilder

5用于第二次ProcessBuilder

其目标是:

读取带有所有项目的settings.properties文件,并能够运行我的主要项目。

谢谢。

再见

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73924557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档