0

これは非常に大きな問題になる可能性があります。

私は1つのサービス(notifierなど)を持っており、このサービスのメソッド[notifyTransaction(Transaction trans)など]の1つはコールバックにリモートで利用できます。

現在、着信トランザクションを読み取り続け、notifier のリモート メソッドを呼び出す (transactionsReader) などの他のサービスがあります。notifyTransaction(Transaction trans).

問題を説明するために、私のトランザクションには複数の操作が含まれていることを付け加えたいと思います。そして、操作を処理するために、私は言う1つの関数を持っていますprocessOperation(Operation op).

これprocessOperation(Operation op)は実際にデータベースでいくつかの更新を行います。

どうしたの ?notifyTransactions()サービス transactionsReader は、着信トランザクションを非常に高速で読み取り、メソッドによる操作の処理速度よりもはるかに速い速度で を呼び出していprocessOperation(Operation op)ます。

私がしたいこと ?notifyTransactions()multithreadint を使用して、すべてのトランザクションを処理する複数のスレッドを使用したいと考えています。

開始するには、メソッドで使用 ExecutorService executor = Executors.newFixedThreadPool(2); し、notifyTransactions()メソッド processOperation(Operation op) のタスクを作成しました。しかし、これにより、呼び出しごとに異なるプールが作成されるnotifyTransactions()ため、数秒で約 3000 のプールが作成されました。そしてついにメモリ不足になりました。

他に考えられる解決策は何ですか?

前もって感謝します :)

4

1 に答える 1

1

開始するには、 ExecutorService executor = Executors.newFixedThreadPool(2); を使用しました。メソッド notifyTransactions() で

ExecutorServiceこれは、インスタンスが両方で共通である必要がある問題です。操作ごとに呼び出しを開始すると、多数のスレッドが作成されます。submit内部でタスクを呼び出すだけですnotifyTransactions()

制限付きのBlockingQueueを使用して、生産者と消費者のアプローチを使用する必要があります。したがって、キューがいっぱいの場合、プロデューサーはキューが空の場合に停止し、コンシューマーは停止します。したがって、あなたのケースprocessOperation(Operation op)では、操作を処理して BlockingQueue に入れるプロデューサーがあり、内部でnotifyTransactions()はそれをデキューしてそれに応じて処理します。

于 2012-10-11T17:47:46.323 に答える