複数のスレッドに複数のWebページをロードする方法を見つけようとしました。 1つの終了時に新しいページが読み込まれます。また、ページがダウンロードされた後にロードされたコンテンツ用の別の後処理スレッドが存在し、プロセス全体が連鎖するようにする必要があります。新しいタスクが開始できるときに通知するコールバック付きのJavaタスクキュー、スレッドプール、およびスレッド
私はそれをしたいのですがどのように:
- タスクキューは、スレッドプールがページをロードするタスクキュー内のページをダウンロードするスレッドの一定数が(とりました
- をダウンロードする必要があるページを保持していますページのダウンロードが完了すると、キューから新しいタスクが代わりに
- 開始することができるように、スレッドはこれを通知しなければならない
- ) スレッドの数は、CPUコアの数よりもはるかに高くなることができるようにいくつかの時間
他のスレッドプールにはCPUコア数と同じスレッド数があります後処理の場合)、このスレッドプールはダウンロードしたページに対して後処理を行います。
ページの後処理が完了すると、すべてのページがダウンロードされている場合は、キュー内の他のページは
事後処理できるように、スレッドはそれを通知しなければならないが(キューが空です)、
:最初のスレッドプールは、私のようなものを持っているfor (int j = 0; j < threads.length; j++) { threads[j].start(); } for (int j = 0; j < threads.length; j++) { threads[j].join(); }
ページのダウンロードが完了したら、後処理のために別のタスクキューにコンテンツを転送する必要があります
(全てのページがダウンロードされ、後処理されています)の両方のタスクキューが空の場合、他のスレッドプールをシャットダウンすることができ、シャットダウンすることができ
しかし、このようにしてロードするすべてのページは別々のスレッドに同時にあり、スレッドの数を制限したい。もっと重要なのは、スレッドを再利用して、1つのタスクが終了したときにスレッドが次のタスクを実行したいということです。私はwhileループでこれを行うことができますが、これは私が避けようとしているものです。キューがより多くのタスクを持っているかどうか、そしてスレッドが空いているかどうかをwhileループがチェックすることは望ましくありません。何らかのコールバックを使用することができるので、スレッドは完了したプールに戻るように指示し、データを返します。 私はまた、ダウンロードタスクが〜のコンテンツをデータ構造に格納し、それを後処理タスクキューに追加することも望みます。
私がこれまでに見つかった最良のリソースは次のとおりです。 Thread pools Callback
しかし、それもそれを私が望む方法を作成することが可能であるかどうかはわかりません。私は関数ポインタについて考えるのをやめました。
2つのプールを使用している点はありますか? 1つのプールで1つのタスククラスでダウンロードして処理するだけではいかがですか。ダウンロードしたデータを同じプロセッサコアを使用している別のプールにキューイングしても、私には利点はありません。 –
私はそのJBを見て、後であなたに戻ってきます。私は、PostProcessPageTaskを2番目のエグゼキュータに提出するDownloadTaskを持っていると思っています。 – user979899
@Martin: 私はすべてをシリアルで行い、全くパラレルではないかもしれませんが、もっと速くしようとしていました。ページからコンテンツをダウンロードするのは転送速度に大きく依存します(CPUに余分な負荷がかからない限り)ので、同時に多数のページをダウンロードできますが、コンテンツの後処理はCPUの負荷だけに依存します。したがって、一度に100ページからコンテンツをダウンロードするとしたら、後処理を行っているスレッドは約100個になりますが、効率的ではありません。 – user979899