2011-02-09 4 views
0

小さなプログラミング演習でベクトルクロックを実装する必要があり、Javaを使用することに決めました。私の質問は、プロセスのベクトルクロックを操作する実際のアルゴリズムとは関係ありませんが、ほかのJavaプログラムや他のJavaプログラムから子プロセスを比較的簡単に初期化する方法はありますか?プロセスフォーク、子プロセスなど[Java]

私の最初の計画は次のとおりです。私は、開始するクライアント/子どもの数を決定し、次にこれらの子/クライアントが互いに通信し、それに応じて対応するベクトルクロックを更新することを決定する「メインプログラム」を持っています。開始されるクライアントの数は、「メインプログラム」に与えられた特定の入力ファイルの行数によって異なります。これらのクライアントプロセスを開始する最もエレガントな方法は何ですか?それぞれ2つのファイルと整数をパラメータとして取ります。ファイルは何をするか(クロックを送るか進めるか)を指示し、整数は設定ファイルのどの行からクライアントが使用するポート番号を選ぶかを指示します。

+0

あなたの質問は何ですか? –

+0

Javaや他の何かのスレッドやexec()バリエーションを使用するかどうか。以前は並行操作が必要なことは何もしていませんでした。また、各クライアントが初期化される前に、クライアントが入力を読み込んで動作するようになると、問題が生じる恐れがあります。これは簡単に防止されていますか? – 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

最初のスレッドが実行される前にすべてのスレッドが初期化されていることを確認したい場合は、スレッド[]を作成し、後ですべてのスレッドに対してstart()を呼び出す余分なループを追加します(すべてのスレッドが終了した時点を簡単に把握するには配列が必要です) – Voo

関連する問題