如何在一个java进程中调用我的jar文件

时间:2012-03-08 10:01:10

标签: java jvm

我有执行jar文件,我使用java -jar xx.jar -file xx.file来执行它。现在,我需要使用该jar文件超过56次并发,所以应该有超过56个java。 exe任务经理。 但它会为我的PC耗费大量资源,是否有方法只启动一个java进程并使用不同的参数执行。 不确定你能否理解我的观点,如果不清楚,请告诉我。 jar文件不是我写的,我只有二进制文件。

有任何线索吗?

还有一个问题,如果有超过56个java进程的原因是什么,会减慢我的电脑速度非常慢?我可以将jvm设置为使用低内存或低CPU使用率来修复它吗?

谢谢, 尤金

3 个答案:

答案 0 :(得分:3)

这可以在一个Java应用程序中使用,而无需使用单独的进程...

在这个例子中,我启动了一个单独的可执行jar文件10次。我使用标准的JarFile类来查询主类,然后在新线程上执行它。另外,我为每个实例使用单独的类加载器。这很重要,因为没有它,单身人士会在不同的应用程序之间发生冲突。

public static void main(String[] args) {

    for (int i = 0; i < 10; i++) {
        try {
            File file = new File("foo.jar");
            JarFile jar = new JarFile(file);
            String main = jar.getManifest().getMainAttributes()
                    .getValue(Name.MAIN_CLASS);

            URLClassLoader freshLoader = new URLClassLoader(
                    new URL[] { file.toURI().toURL() }, null);

            Class<?> classToLoad = Class.forName(main, true, freshLoader);
            Class<?>[] argTypes = new Class[] { String[].class };
            final String[] mainArgs = new String[] { "arg1", "arg2" };
            final Method method = classToLoad.getMethod("main", argTypes);

            Runnable job = new Runnable() {
                @Override
                public void run() {
                    try {
                        method.invoke(null, (Object) mainArgs);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            new Thread(job, "Thread :" + jarFile).start();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

测试app类(包含在可执行jar文件foo.jar中)来模拟你的第三方jar ...

public class Main {

    private static int counter;

    public static void main(String[] args) {
        JFrame frame = new JFrame("Test frame");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new GridLayout(2, 1));
        frame.getContentPane().add(new JLabel("instance " + counter));
        frame.getContentPane().add(
                new JLabel("launched with " + Arrays.asList(args)));
        frame.pack();
        frame.setVisible(true);

        counter++;
    }

}

答案 1 :(得分:0)

您可以在应用程序中使用Threads。这样,您就有了一个Java进程。这将再次产生50-60个线程。您可能需要稍微重新设计应用程序才能执行此操作。看一下这个页面的开始; http://www.javaworld.com/javaworld/jw-04-1996/jw-04-threads.html

答案 2 :(得分:0)

56个java进程总是会减慢你的电脑速度。您可以在命令行上使用-Xmx进行最大内存设置,使用-Xms进行最小内存设置。

备注,我真的不认为运行56个java进程是个好主意