每个线程一个“Java上下文”?

时间:2013-07-24 07:36:19

标签: java multithreading

是否可以从另一个Java程序启动Java程序,就像我使用其他Java命令启动它一样?从另一个程序直接调用程序的main()方法时, Java上下文对于这两个执行都是通用的。我正在尝试为每个线程创建一个 Java上下文

插图:

的src / COM /项目/ ProjectLauncher.java

public class ProjectLauncher {

    static {
        PropertyConfigurator.configure("log4j.properties");
    }

    public static void main(String[] args) {
        Logger.getLogger(ProjectLauncher.class).info("started!");
        // Logs well as expected.
    }

}

测试/ COM /项目/ TestProject.java

public class TestProject extends TestCase {

    public void testProject() {
        ProjectLauncher.main(null);
        Logger.getLogger(TestProject.class).info("tested!");
        // The above line logs well, while log4j has been initialized in ProjectLauncher.
        // I would like it to need its own initialization in this class.
    }

}

我尝试在另一个线程/ runnable中启动main方法,但ProjectLauncher仍然初始化了记录器。

1 个答案:

答案 0 :(得分:2)

当你启动Java进程时,它是一个新的JVM实例。如果您希望启动另一个JVM实例,那么您需要启动一个单独的进程。

    List<String> command = new ArrayList<String>();
    command.add("java");
    command.add("ProjectLauncher");
    ProcessBuilder builder = new ProcessBuilder(command);
    builder.redirectErrorStream(true);
    final Process process = builder.start();
        try {
           process.waitFor();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        //if you wish to read the output of it then below code else you can omit it.
        InputStream is = process.getErrorStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        while ((line = br.readLine()) != null) {
            Logger.getLogger(MyClass.class.getName()).severe(line);
        }

上面我们最终开始了一个新的过程,实际上是java ProjectLauncher。如果该类尚未编译,则您必须使用javac而不是java而不是ProjectLauncher.java而不是ProjectLauncher等编译它。 / p>