2009-05-13 2 views
3

Возможно ли создать полную версию «ПРОГРАММЫ» в двух подпрограммах из одной последовательности выполнения?Формирование процесса на Java

Полученные подпрограммы полностью идентичны. Они имеют одинаковые последовательности выполнения и значения, но теперь они представляют собой две разные программы. Это похоже на создание клона объекта, что дает нам возможность работать с двумя разными объектами того же типа. Но вместо того, чтобы просто объект и некоторые значения, здесь мы хотим создать полностью параллельную последовательность выполнения программы, уже загруженной в JVM (предпочтет ответ для Java).

+0

Что такое «программа»? «Основной» объект (тот, у которого есть общедоступный статический void main? Хотите две копии этого объекта в параллельных потоках в одной JVM? Или вы хотите, чтобы два JVM запускали этот объект? –

+0

Не совсем основной объект. хотя и интересный вопрос: возможно ли вызывать другой JVM (2) во время выполнения со входом в качестве текущего состояния JVM (1)? –

+1

Вы не можете этого сделать. Почему вы хотите «создать полностью параллельную последовательность выполнения программы, уже загруженной в JVM »? Это решение, а не проблема. Что такое * актуальная * проблема, которую это решение пытается решить? –

ответ

7

Вы, кажется, ищете Java-эквивалент fork system call от Unix.

Это не существует на Java, и неясно, возможно ли это, поскольку процессы в Unix не имеют прямого эквивалента в JVM (потоки менее независимы, чем процессы).

Существует, однако структура вилы планируется Java 7:

http://www.ibm.com/developerworks/java/library/j-jtp11137.html

Это не то же самое, как Unix'es вилка/присоединиться, но он разделяет некоторые идеи и могут быть полезны.

Конечно, вы можете выполнять параллельное программирование на Java, это просто не делается с помощью fork(), но с использованием Threads.

+0

Я думаю, вам следует пояснить, что каркас fork и join действительно это не то же самое, что UNIX fork ...! –

+0

Ну, да. Однако, насколько я понимаю, это связанная концепция и может помочь решить те же проблемы. Ответ отредактирован. – sleske

+0

Это не связано Я имею в виду, да, это материал работает параллельно, но идея каркаса fork/join заключается в одновременном запуске множества мелких мелкомасштабных задач. Вилка для Unix предназначена для запуска другого процесса; он работает, копируя текущий процесс, но в большинстве случаев вы сразу же делаете «если это дочерний процесс, делайте что-то еще целиком». –

4

Я не уверен, что вы пытаетесь сделать здесь. Это звучит так, как будто у вас есть решение в виду проблемы, которая лучше всего будет решена по-другому. Что-то вроде этого выполнит ваш конечный гол?

public class MyApp implements Runnable 
    { 
    public MyApp(int foo, String bar) 
    { 
    // Set stuff up... 
    } 

    @Override 
    public void run() 
    { 
    // Do stuff... 
    } 

    public static void main(String[] argv) 
    { 
    // Parse command line args... 

    Thread thread0 = new Thread(new MyApp(foo, bar)); 
    Thread thread1 = new Thread(new MyApp(foo, bar)); 

    thread0.start(); 
    thread1.start(); 
    } 
    } 

Хотя я бы, вероятно, положил main() в другом объекте в реальном приложении, так как управление жизненным циклом является отдельной проблемой.

+0

Спасибо за ответ. Но у меня было что-то еще в виду. Я просто не хочу запускать какой-либо один метод (например, MyApp (..)), но мне просто нужна вилка, т. Е. Полная обработка всех ресурсов, используемых во время выполнения. –

+0

Я знаю, что вы * хотите * делать. Мне интересно, что * проблема * вы пытаетесь решить, для чего вы * нуждаетесь в этом конкретном решении. Почти в любом случае, о чем я могу думать, что-то в соответствии с моим решением более уместно. Если вы просто просите академически, все в порядке, но похоже, что у вас есть очень специфическая проблема, которую вы пытаетесь решить, и все происходит неправильно. –

+0

Это была абстрактная мысль, которую я получил. Я просто хотел проанализировать его практическую осуществимость. –