java - 每个线程一个 "Java context"?

标签 java multithreading

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

插图:

src/com/project/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/project/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.
    }

}

我尝试在另一个线程/可运行中启动 main 方法,但记录器仍由 ProjectLauncher 初始化。

最佳答案

当你启动一个 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 而不是 javaProjectLauncher.java 而不是 ProjectLauncher

关于java - 每个线程一个 "Java context"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17827911/

相关文章:

java - 在 KeyStore.load() 中使用日语密码会导致 java.io.IOException : Keystore was tampered with, 或密码不正确

c# - Java 和 C# 线程处理数据同步的方式有何不同?

C++多线程使用并发变量停止线程

java - 如何重用线程?线程什么时候关闭?

java - 在 Java 中执行 get 请求会导致 HTTP 响应代码 : 415

java - 在 JSTL/EL 中如何获取集合中的第一个元素?

c# - 为什么这个 Parallel.ForEach 循环没有提高性能?

c - 如何在 C 中跨线程进行动态数据传输和内存管理?

java - 在 Mac OS X 上通过 java 程序使用命令写入文件

java - Spring MVC - 使用 java 为 Controller 创建 httprequest