1

これは正しいです?

ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor)          
                                        Executors.newFixedThreadPool(numThreads);

getActiveCount()型キャストするとgetQueue()メソッドにアクセスできるため、これを行っています。Eclipse はここでエラーのフラグを立てていませんが、私がやっていることは正しいことを確認したいのです。

ThreadPoolExecutor implements ExecutorServiceにキャストExecutorServiceしているので、実際には奇妙ですThreadPoolExecutor

4

3 に答える 3

4

私は通常@Evgeniyが述べた理由に同意しますが、ThreadPoolExecutorのJavadocはインスタンスの作成にファクトリメソッドを使用することを特に推奨しているため、この特定のケースでは実際には問題ありません。

これは、これらのメソッドが期待される ThreadPoolExecutor を返すという契約上の義務と見なします。ソースコードは時間の経過とともに変化する可能性があるため、ソースコードを見ることに依存しませんが、javadoc の明示的な推奨事項は信頼できるはずです。

ThreadPoolExecutor の javadoc から

幅広いコンテキストで役立つように、このクラスは多くの調整可能なパラメーターと拡張性フックを提供します。ただし、プログラマーは、より便利な Executors ファクトリ メソッド Executors.newCachedThreadPool() (自動スレッド再利用による無制限のスレッド プール)、Executors.newFixedThreadPool(int) (固定サイズのスレッド プール)、および Executors.newSingleThreadExecutor() (単一のバックグラウンド) を使用することをお勧めします。スレッド)、最も一般的な使用シナリオの設定を事前に構成します。それ以外の場合は、このクラスを手動で構成および調整するときに次のガイドを使用してください。

于 2013-07-26T12:45:57.077 に答える
1

newFixedThreadPool のソース コードを見て、それが ThreadPoolExecutor を返すことを確認できるため、キャストによって例外がスローされません。もちろん、将来誰かが「newFixedThreadPool」の実装を変更すると、コードが機能しなくなる可能性があります。

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
于 2013-07-26T12:37:01.113 に答える