2

これは学業です。ピアツーピア スレッド モデルを作成しようとしています:

http://www.informit.com/articles/article.aspx?p=169479&seqNum=5

委任モデルにはタスクをワーカー スレッドに委任するボス スレッドがあるのに対し、ピア ツー ピア モデルではすべてのスレッドが同等の作業ステータスを持ちます。すべてのタスクを実行するために必要なすべてのスレッドを最初に作成する単一のスレッドがありますが、そのスレッドはワーカー スレッドと見なされ、委任は行われません。このモデルには、集中スレッドはありません。

したがって、メイン スレッドは 5 つのスレッドを作成し、それがキューのリッスンを開始し、メイン スレッドで 10 秒間ジョブを作成します。また、すべてのスレッドがタスクを実行する必要があるため、このスレッドもジョブを待機する必要があります。これどうやってするの?

BlockingQueue<Job> queue = new ArrayBlockingQueue<Job>(1000);

    Collection<Thread> workers = new ArrayList<Thread>();
    for(int i = 0; i < 5; i++) {
        Thread thread = new Thread(new Worker(queue));
        workers.add(thread);
        thread.start();
    }

    long endTime = System.currentTimeMillis() + 10000;
    Random r = new Random();
    while(System.currentTimeMillis() < endTime) {
        try {
            CalculateJob job = new CalculateJob(r.nextInt(50), r.nextInt(50), r.nextInt(50));
            queue.put(job);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }   

したがって、私のメインスレッドはスレッドの作成に取り組み、ワーカーはただ座っているだけqueue.take()です.

ピアツーピア モデルでは、すべてのスレッドqueue.take()がジョブを待機する必要があることを正しく理解していますか。もしそうなら、どうすればこれを行うことができますか? 助言がありますか?

4

4 に答える 4

1

あなたがリンクした記事には、雇用がどのように生み出されるかは書かれていません。それらはおそらく、他の場所から作成されたことを意味します。各モデルの数値を見ると、次のことがわかります。

  • 「委任モデル」では、メイン スレッドがジョブを実行するワーカー スレッドを決定します。
  • 「ピア ツー ピア モデル」では、ピア スレッドは共通のキューから作業を取得する (そして、たまたま最初に実行されたスレッドが次のジョブを取得する) ため、ピア スレッドは自分自身を調整します。

ConcurrentQueue を使用することで、実際にピア ツー ピア モデルを実装したことになります。

要約すると、それらの違いは、作業がどのように作成されるかではなく、スレッドがどのように作業を調整するかです。

于 2012-09-30T11:31:01.830 に答える
1

提案されたように、あなたが提供した記事自体

ピア ツー ピア モデルでは、すべてのスレッドが同等の動作ステータスを持っています。すべてのタスクを実行するために必要なすべてのスレッドを最初に作成する単一のスレッドがありますが、そのスレッドはワーカー スレッドと見なされ、委任は行われません。

たまたまワーカーでもある Boss スレッドは、ジョブをキューにtake()入れ、ジョブの投入が終了したら呼び出すことでワーカーのように振る舞うことができます。

Bossスレッドがジョブの作成を完了するまですべてのスレッドをブロックしたい場合はCountDownLatch、シングルカウントで使用できます。

このモデルが私たちの生産者/消費者モデルに利点があるかどうかは本当にわかりません。

于 2012-09-30T11:31:16.343 に答える