1

Javaでは、多くのTCP接続(MINA)が特定のスレッドの作業を作成していて、このスレッドが過負荷になり、キューに入れられて遅れる場合があります。プロセス内でこれを監視して、スレッドが停止したときにアプリケーションがワークロードを削減できるようにするための良い方法を考えています。基本的に、これを行うために私が知っている唯一の方法は、監視タスクをスレッドにドロップし、ときどきポーリングしてそれらが終了したかどうかを確認することですが、もっと直接的なものがあるはずだと思います。

4

2 に答える 2

2

秘訣は、スレッドのジョブをキューに入れるのではなく、タスクで機能するスレッドプールを用意することだと思います。次に、タスクで動作するスレッドの数のバランスをとることができます。

スレッドの初期数を設定したいが、ブロッキングキューがいっぱいになった場合はそれを増やしたい場合があります。初期サイズを超える最初のスレッドが割り当てられる前に、キューがいっぱいになる必要があることを理解することが重要です。私はそれが直感に反していることを知っていますが、それはそれが機能する方法です。

BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(QUEUE_SIZE);
ExecutorService threadPool = new ThreadPoolExecutor(NUM_INITIAL_THREADSs,
            MAX_NUM_THREADS, 0L, TimeUnit.MILLISECONDS, queue);
...
// submit the jobs...
// after submitting the jobs, you need to shutdown the queue
threadPool.shutdown();

@Cratylusが述べたように、キューをバインドして、空きがない限り追加のジョブがキューに入らないようにすることができます。これにより、ジョブプロデューサーの速度は低下しますが、実行速度は向上しません。スレッドプールを定義した後、例外をスローする代わりにプロデューサーをブロックする拒否ハンドラーを設定できます。

threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() {
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
       // this will block if the queue is full
       executor.getQueue().put(r);
    }
});
于 2012-11-21T21:20:10.623 に答える
0

私が正しく理解している場合、タスクはスレッドによって処理されるようにキューに入れられ、スレッドが追いつかない間にワークロードが増加してもキューが無期限に大きくならないようにする方法が必要です。

制限付きキューを使用すると、キューが容量に達すると、スレッドが対応できないことがわかり、ワークロードを待機/削減できます(OPは非常に抽象的であるため、私の答えは鳥の視点からもです)。キューがクリアされ始めます

于 2012-11-21T21:03:55.653 に答える