Javaピアツーピアスレッドモデル、誰もが仕事を待っています
-
11-12-2019 - |
質問
これは学業です。 ピアツーピアスレッドモデルを作成しようとしています。
http://www.informit.com/articles/article。 ASPX?P= 169479& SEQNUM= 5
委任モデルにタスクをワーカースレッドに委任するボススレッドがある場合は、ピアツーピアモデルですべてのスレッドに等しい動作状態が等しい。すべてのタスクを実行するために必要なすべてのスレッドを最初に作成するシングルスレッドがありますが、そのスレッドはワーカースレッドと見なされ、委任ができません。このモデルでは、集中型のスレッドはありません。
SOマイメインスレッドWilllは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()
で座っています。ピアツーピアモデルでは、すべてのスレッドがジェネラコデタグコードまたはジョブを待つ必要があることを正しく理解しています。もしそうなら、どうすれば私はこれをすることができますか?どんな提案ですか?
解決
あなたがリンクした記事は、ジョブの作成方法を言うことになりません。彼らはおそらく彼らが他の場所から作られていることを意味します。それぞれのモデルの数値を見て、私たちはそれを見ます:
- 「代表団モデル」では、メインスレッドはどのワーカースレッドがジョブを実行するかを決定します。
- 「ピアツーピアモデル」では、ピアスレッドが共通のキューから作業します(そして最初に次のジョブが最初に発生する場合はどちらか、どちらのスレッドが発生するのか)、ピアスレッドが自分自身を調整します。
ConcurrentQueueを使用することで、実際にピアツーピアモデルを実装しました。
要約すると、それらがする区別は、作業の作成方法ではなく、糸が作業をどのように調整するかです。
他のヒント
あなたが提供した記事を提案したように
ピアツーピアモデルでは、すべてのスレッドに等しい動作状態があります。すべてのタスクを実行するために必要なすべてのスレッドを最初に作成するシングルスレッドがありますが、そのスレッドはワーカースレッドと見なされ、委任がない
労働者であることが起こる上司のスレッドは、キューに入れられたジョブを作成し、ジョブを入れることで終わったら
take()
を呼び出すことによって労働者のように機能することができます。ボススレッドがジョブの作成を終了するまで、すべてのスレッドをブロックしたい場合は、
CountDownLatch
を単一カウントで使用できます。私は本当にこのモデルが私たちのプロデューサー/コンシューマモデルを持っているかどうかわからない。
java と WookScrewモデルが並行性の一般的な概念であるかのように聞こえるという事実のために、CでPSUEDOコードを追加します。
ワークスケールモデルとしても知られているピアモデルでは、1つのスレッドが必要です プログラムが起動したときに他のすべてのピアスレッドを作成します。このスレッド その後、要求を処理する別のピアスレッドだけとして機能します。 または他のピアが終了するのを待っているかを中断します。ピア モデルは各スレッドをそれ自身の入力を担当します。ピアは知っています それ自身の入力が早めに、それを入手する独自のプライベートな方法があります 入力、または他のピアとの入力点を共有します。
.main() { pthread_create( ... thread1 ... task1 ) pthread_create( ... thread2 ... task2 ) . . . signal all workers to start wait for all workers to finish do any clean up } task1() { wait for start perform task, synchronize as needed if accessing shared resources done } task2() { wait for start perform task, synchronize as needed if accessing shared resources done }
すべてのソースは Pthreadsプログラミング - より良いマルチプロセッシング、Buttlar、FarrellのためのPOSIX規格、 Nichols