2011-02-09 6 views
0

작은 프로그래밍 연습에서 벡터 시계를 구현해야하고 Java 용으로 결정했습니다. 내 질문은 프로세스의 벡터 시계를 조작하는 실제 알고리즘과 관련이 없지만 다른 Java 프로그램이나 다른 Java 프로그램에서 상대적으로 쉽게 다른 Java 응용 프로그램이나 자식 프로세스를 초기화하는 방법은 무엇입니까?프로세스 포크, 자식 프로세스 등 [Java]

내 초기 계획은 다음과 같습니다. 시작하는 클라이언트/자식 수를 결정하는 "주 프로그램"이 있으며,이 자식/클라이언트는 서로 통신하고 그에 따라 해당 벡터 시계를 업데이트해야합니다. 시작될 클라이언트의 수는 "주 프로그램"에 제공된 특정 입력 파일의 행 수에 따라 다릅니다. 이 클라이언트 프로세스를 시작하는 가장 우아한 방법은 무엇입니까? 그들은 각각 두 개의 파일과 정수를 매개 변수로 취해야합니다. 파일은 무엇을 할 것인지 (clock 보내기 또는 advance)를 알려주고 정수는 구성 파일의 어떤 줄에서 클라이언트가 사용할 포트 번호를 선택해야하는지 알려줍니다.

+0

). –

+0

스레드 또는 일부 exec() Java 또는 다른 유사한 변형을 사용할지 여부. 이전에 동시 작업이 필요한 작업을 수행하지 않았습니다. 또한 각 클라이언트가 초기화되기 전에 클라이언트가 입력 내용을 읽고 작업하기 시작하면 문제가 발생할 수 있습니다. 쉽게 예방할 수 있습니까? – treiman

+0

카운트 다운 래치 (java.util.concurrent.CountDownLatch)와 같은 것을 사용하여 스레드가 너무 일찍 시작하지 않도록하십시오. – Erik

답변

2

java에서 concurrent tasks을 만드는 개념은 processes이 아닌 threads을 기반으로합니다. 새로운 process을 시작하려면 일반적으로 java를 여러 번 호출하거나 ProcessBuilder 인터페이스를 사용해야합니다. Java의 동시성은 스레드 용으로 설계되었으므로 시도해 볼 것을 권장합니다 (예 :

public static void main(String[] args) { 
    int numberOfThreads = ... 
    for(int i = 0; i < numberOfThreads; i++) { 
     File f1 = ... 
     File f2 = .... 
     int j = ... 

     new Thread(new VectorClock(f1, f2, j)).start(); 
    } 
} 

public class VectorClock implements Runnable { 
    public VectorClock(File file1, File file2, int i) { 
     // ... 
    } 

    @Override 
    public void run() { 
     // this gets executed when invoked by a threads .start() routine 
    } 
} 
+0

첫 번째 스레드가 실행되기 전에 모든 스레드가 초기화되도록하려면 다음과 같이 a Thread [] 그리고 모든 스레드에 대해 start()를 호출하는 추가 루프가 포함됩니다 (모든 스레드가 완료된 시점을 쉽게 알 수있는 방법을 찾기 위해서는 배열이 필요합니다) – Voo

관련 문제