0

私はいくつかのスレッドを作成しました。私は各スレッド名を知っています(エイリアンメカニズムを介してスレッドの名前を設定したとします。)今、私はスレッド内にいて、別のスレッドにメッセージを送信したいと考えています。

Pastry and Chord プロトコルのシミュレーターをコーディングしようとしています。多数の分散ノードを持つことができないため、多数のスレッドを作成しました。ここで、各スレッドが相互にメッセージを送受信するようにします。各ノード名を IP (ランダムに生成された番号) として設定しました。現在、あるノードから別のノードにメッセージを送信する方法がわかりません。別のスレッド名を知っている場合、あるスレッドから別のスレッドにメッセージを送信する方法を教えてください。

4

3 に答える 3

2

ある種のメッセージシステムを提案します。最も簡単な方法は、スレッドセーフな FIFO を作成し、それを各スレッドに渡すことです。各スレッドに直接メッセージを送信したい場合は、スレッドごとに「トピック」を作成します。

スレッド名を使用して何かをハッキングしようとしないでください。後で制約を受けるだけです。

コメントから貼り付けて、解析できるようにします。

プライベート静的 BlockingQueue[] キュー。
プライベート静的 int queueNum = 0;
public static void newQueue (文字列 ip)
{
    queue[queueNum] = new ArrayBlockingQueue(1024);
    試してください{キュー[キュー番号].put(ip); }
    catch (InterruptedException e){e.printStackTrace(); }
    queueNum++;
}

ああ、私はあなたの問題を見ます。BlockingQueue に値を割り当てることはありません。その行を次のように変更してみてください。

private static BlockingQueue[] queue=new BlockingQueue[10];

これにより、10 個のキューが許可されます。

また、配列の代わりに HashMap を使用して、自由にキューに名前を付けたり、追加したり、削除したりできるようにすることもお勧めします。queue[2] である代わりに、 queue.get("Thread1Queue") またはより説明的なものに対処します。

コメントへの応答に注意してください: HashMap は通常、配列を置き換えることができます。ルックアップはほぼ同じくらい高速ですが、インデックスには数字の代わりに何でも使用します。メソッドはオーバーライドされます)、通常は文字列です。

したがって、多数のキューを保存していて、それらに具体的な名前を付けたい場合は、次のように言えます。

HashMap queues=new HashMap();
queues.put("queue1", new ArrayBlockingQueue(1024));
queues.put("queue2",new ArrayBlockingQueue(1024));
...

次に、アクセスしたいときはいつでも使用できます:

queues.get("queue1").put(新しい ThingToAddToArrayBlockingQueue())...

「追加するもの」をキュー1に入れます。

それらの「束」が必要で、どれがどれであるかを知る必要がない場合 (一般的なタスクに供給できるスレッドのコレクションのみ)、そのための特定のコレクション/パターンが並行パッケージにあります。

于 2013-01-30T17:07:54.833 に答える
1

スレッド間で通信する通常の方法は、オブジェクトを各スレッドに渡して、スレッド間で通信できるようにすることです。複数のスレッドによってアクセスされるそのオブジェクトのすべてのフィールドとメソッドを同期する必要があることに注意してください。

しかし、ネットワーク プロトコルをシミュレートしたい場合は、わざわざプロセス間通信にネットワーク ソケットを使用してみませんか? 各スレッドが 127.0.0.1 の異なるソケットをリッスンするようにするだけです。

于 2013-01-30T17:04:31.890 に答える
0

メッセージを送信し、それらを他のスレッドで処理したい場合は、スレッドがメッセージを送り込むことができる共有オブジェクト (キュー、マップなど) が必要です。受信スレッドは、着信メッセージをチェックし、プルして、必要な処理を行う必要があります。

于 2013-01-30T17:34:51.670 に答える