クライアントからファイルを受信して歳差運動するRESTWebサービスを開発しています。その後、ファイルを受け取ったので、ファイルを処理するための新しいスレッドを作成したいので、処理機能の終了を待つ必要はありません。
たくさんのファイルを受け取っている場合は、たくさんのスレッドを作成します。これを行うための制限や危険はありますか?
クライアントからファイルを受信して歳差運動するRESTWebサービスを開発しています。その後、ファイルを受け取ったので、ファイルを処理するための新しいスレッドを作成したいので、処理機能の終了を待つ必要はありません。
たくさんのファイルを受け取っている場合は、たくさんのスレッドを作成します。これを行うための制限や危険はありますか?
たくさんのファイルを受け取っている場合は、たくさんのスレッドを作成します。これを行うための制限や危険はありますか?
はいあります。スレッド数に制限があるかどうかはわかりませんが、ある時点でメモリが不足します。各スレッドには、スタックとその他のローカルストレージがあります。
制限に達した場合は、新しい接続を受け入れないことで、フォークしたスレッドの数を制限します。次に、前の要求が完了するまで、追加の接続がTCPキューで待機します。
より良いメカニズムは、ExecutorService
リクエストごとに新しいスレッドをフォークする代わりに、固定スレッドプールを使用することです。
// create a thread pool with 10 workers
ExecutorService threadPool = Executors.newFixedThreadPool(10);
while(!shutdown) {
// receive a request from your service -- this is tricky
// process it using the thread pool
threadPool.submit(new MyRequest(...));
}
...
// once we have submitted all jobs to the thread pool, it should be shutdown
threadPool.shutdown();
これのトリッキーな部分は、どの接続が読み取り可能かを判断する方法です。これには、NIOコード、チャネルセレクターなどが必要で、接続を多重化して、どの接続を読み取ることができるかを確認する必要があります。
クライアントからファイルを受信すると、それは異常に新しいスレッドで処理されます。スレッドの数は2つの制限があります。1。アプリケーションサーバーの設定(たとえば、JBossまたはTomcatはデフォルトで100スレッドを同時に処理できます)。2.WSプロバイダーにスレッドキューが含まれているように見える場合があります。例として、CXFはデフォルトで10個のスレッドを同時に処理することを許可しません(この構成を変更しない場合)。
最善のアプローチは、スレッドの作成に関する限り、パフォーマンスが向上し(事前に作成されます)、システムが過負荷になったりメモリが不足したりしないようにリソース管理が向上するスレッドプールを使用することです。
理論的には、マシンが処理できる数のスレッドを作成できます。スレッド数に制限はありませんが、1000を超えるスレッドを開くと、マシンの速度が低下することが予想されます。
申し訳ありませんが、あなたの質問は、あなたが車輪の再発明を試みていることを示しています。
まず、サーバーを作成するときにスレッドプールを使用する傾向があります。これにより、アプリケーションが余分なスレッドを作成するのを防ぎ、パフォーマンスを向上させます。次に、最新のサーバーはすべてNIOを使用し、リクエストごとにスレッドを作成しません。第三に、そして最後に:なぜあなたはすでに開発されたものを開発しているのですか?標準のAPIをサポートする完璧なJavaWebサーバーはたくさんあります。多くのRESTフレームワークがあります。最も才能のあるプログラマーでさえ、妥当な時間内に存在するものよりもうまく機能するWebサーバーを開発する機会がありません。
宿題をしているのなら、最後のポイントは関係ありません。
ThreadPoolを使用してください...
private static final int THREAD_COUNT = 10;
private static final ThreadPoolExecutor pool = new ThreadPoolExecutor(
THREAD_COUNT, THREAD_COUNT, 10, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>());
public static void submitAgentToPool(Runnable thread) {
try {
if(thread != null) {
LOG.info("ActiveThreads :" + pool.getActiveCount());
pool.execute(thread);
}
catch (Exception e) {
LOG.error("Exception while Starting thread: " + e.getMessage(), e);
}
}
このプールにスレッドを追加し続けてください...これにより、瞬時に10個のスレッドのみが実行されるようになります