A次の特性を持つサードパーティ クラスを考えてみましょう。
その実装のほとんどは非公開で非常に複雑であるため、拡張することはできますが、合理的に変更することはできません。
A不必要に呼び出すべきではない非常に高価なコンストラクターがあります-私の場合、後で使用するためにデータの巨大なルックアップテーブルを構築します。これは、デコレータ クラスを のドロップイン置換として作成すること
Aは問題外であることを意味します。デコレータは、そのコンストラクタから継承しAて呼び出す必要があるためです。Aはサードパーティ コードによって使用されるため、代わりにプロキシ クラスを使用することはできません。他のコードは のインスタンスを想定Aしており、それを取得する必要があります。A大量のレポートを生成するために多くのwrableをfrabbleする、非常に高価なレポート メソッドを多数提供します。これらのメソッドは、ローカルで使用される結果を生成しません。理論的には非同期である可能性がありますが、残念ながらそうではありません。
Aお互いを呼び出す方法- たくさん。実装は不透明で、常に流動的です。
Aリフレクション ポスト インスタンス化を使用して物事をスリム化するなどのハックは問題外です。Aスレッドセーフではありません-実際には...
私は自分のプロジェクトでボトルネックになるポイントに達したので、実際のワラブルのフラブリングを別のスレッドにプッシュすることを望んAで子クラスを作成しました。オブジェクトを単一スレッドのエグゼキュータ サービスに送信するためだけに、すべてのパブリック メソッドをオーバーライドしました。次に、それぞれがワーカー スレッドから適切なメソッドを実行します。BARunnableRunnablesuper
残念ながら、独自の public メソッドを頻繁に呼び出しAます。通常は問題ありませんが、私の場合、スーパークラスはからメソッドを呼び出しています。メソッドは実際の実行を延期し、新しいタスクをエグゼキューター サービスに送信するため、パフォーマンスと正確性の両方の問題が発生するため、これは大きな問題です。BB
Thread.currentThread()私の解決策は、すべてのメソッドの結果をチェックしてB、ワーカー スレッドからの呼び出しがsuper新しいタスクとして送信されるのではなく、メソッドに直接委任されるようにすることでした。
だから今、私はそれThread.currentThread()がパフォーマンスの問題になっているところにいます。おそらく、あまりにも頻繁に呼び出されるネイティブメソッドであるためです。
スーパークラスやワーカー スレッドからスレッドセーフな方法でメソッド呼び出しを確認するより高速な方法はありますか?
Aのぐらつきを別のスレッドにプッシュできるようにする代替設計はありますか?Aサードパーティのコードであるため、ほとんど閉じ込められているようです...