Как вызвать мой JAR-файл в одном Java-процессе - PullRequest
0 голосов
/ 08 марта 2012

У меня есть исполняемый файл jar, и я использую java -jar xx.jar -file xx.file, чтобы выполнить его. Теперь мне нужно использовать этот файл jar более 56 раз одновременно, поэтому должно быть больше 56 java.Отлично в диспетчере задач.Но это будет стоить много ресурсов для моего ПК, есть ли способ запустить только один процесс Java и выполнить с другим аргументом.Не уверен, что вы можете понять мою точку зрения, если есть неясные, пожалуйста, дайте мне знать.JAR-файл не написан мной, и у меня есть только двоичный файл.

Любая подсказка?

И еще один вопрос, по какой причине, если там более 56 процесс Java, замедлит мой компьютерочень очень медленно?Могу ли я установить jvm как низкое использование памяти или низкое использование процессора, чтобы это исправить?

Спасибо, Евгений

Ответы [ 3 ]

3 голосов
/ 08 марта 2012

Это возможно из одного 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();
        }
    }
}

Тестовый класс приложения (содержится в исполняемом файле 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++;
    }

}
0 голосов
/ 08 марта 2012

56 Java-процессы всегда будут тормозить ваш компьютер.Вы можете использовать -Xmx для настройки максимальной памяти и -Xms для настройки минимальной памяти в командной строке.

Замечание, я действительно не думаю, что запуск 56 процессов Java - это хорошая идея

0 голосов
/ 08 марта 2012

Вы можете использовать темы в вашем приложении. Таким образом, у вас есть один процесс Java. Это снова будет порождать 50-60 потоков. Возможно, вам придется немного изменить дизайн приложения. Взгляните на эту страницу для начала; http://www.javaworld.com/javaworld/jw-04-1996/jw-04-threads.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...