2009-05-13 1 views
3

Ant Java task содержит параметр fork, который по определению «если включено, запускает выполнение класса в другой виртуальной машине». Поскольку мы имеем дело с большим количеством данных, установка этого параметра спасла нас от истечения пространства кучи Java.
Мы хотим иметь возможность делать то же самое с помощью класса Java. Каким будет наилучший способ достижения функциональности, предоставляемой fork?Java-эквивалент fork в Java-задаче Ant?

+0

Если вам нужно больше кучи, чем рассмотреть варианты -Xmx и -Xms при запуске ваше приложение. Возможно, вам не нужны несколько процессов, а больше памяти. Добавлена ​​польза от того, что в рамках одной JVM вы можете использовать примитивы потоков и параллелизма. – basszero

+0

Справа. Мы попробовали это, установив Xms и Xmx в разные значения, но это не помогло. Программа в конечном итоге потерпела крах после запуска в течение разных периодов времени, в зависимости от установленных значений. По-видимому, это связано с памятью, но мы никогда не сталкивались, когда называли ее через Ant (с набором fork). – pugmarx

ответ

8

Выполнение другого процесса Java. Например, используя класс ProcessBuilder.

http://java.sun.com/javase/6/docs/api/java/lang/ProcessBuilder.html

Вы можете использовать столько рабочих процессов, как вы хотите. Заставьте их иметь отдельный основной класс, выполняя свои задания из этого основного класса и завершая работу, когда их задача будет завершена.

Вам нужно будет выяснить их путь к классам и расположение java-двоичного кода в системе, но это выполнимо.

Я думаю, вы даже можете быть уведомлены, когда они завершатся через Process.waitFor().

+0

Я бы сказал, что это будет в той же самой VM. –

+4

Нет, если вы запустите процесс, это будет другая виртуальная машина. Два разных Процесса не могут совместно использовать одну виртуальную машину любыми способами. – alamar

0

Я думаю, что вы можете напрямую использовать Ant API ... Ant может быть непосредственно использован в Java-классе. Javadoc доступен в своем двоичном дистрибутиве.

3

Если вы посмотрите на ant исходный код, когда fork является true, то он просто обертывания Execute задачу и в конечном счете, код, который вызывается в

Runtime.getRuntime().exec(cmd, env); 

Загрузка и иметь взгляд на исходный код для org.apache.tools.ant.taskdefs.Java и org.apache.tools.ant.taskdefs.Execute предоставит вам несколько отличных указателей в поиске местоположения исполняемого файла для самостоятельной работы на платформе и т. д.