2

私はスレッド プール エグゼキュータを機能させようとしていますが、次のコードでどこかで間違っているのではないかと思っています。

public class testPool implements Runnable {

    static Executor pooledExecutor = null;
    private Threat thread = null;

    private testPool(int minThreadPoolSize,
                     int initThreadPoolSize,
                     int maxThreadPoolSize,
                     int threadKeepAliveTime,
                     int queueCapacity) throws Exception {

        pooledExecutor = new ThreadPoolExecutor(initThreadPoolSize,
                                    maxThreadPoolSize,
                                    (long) (1000 * threadKeepAliveTime),
                                    TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>(queueCapacity));

        this.thread = new Thread(this);
        this.thread.setName("testThread");

        try {
              this.thread.setDaemon(true);
        } catch (Exception e) {
           // DO Something
        }
    }

    public void run() {
         while(true){
            try {
                // code to get a testobject
                pooledExecutor.execute(testObject);
             } catch (Exception e) {
                 //Do something
             } finally {
              //if shutdown parameter is true
              break
            }
          }
      }

 }

基本的に、この実装が実際にスレッドを作成するかどうかはわかりませんか? または、スレッドファクトリーを使用する必要がありますか? 以前は createThreads() メソッドを持つ pooledexecutor を使用していましたが、このようなものは表示されません。

また、誰かが最小スレッドプールサイズを設定したい理由はありますか

ヘルプ/アドバイスをいただければ幸いです。

4

1 に答える 1

1

特に指定しない限り、同じスレッド グループにすべてのスレッドを作成ThreadPoolExecutorするデフォルトを使用します。ThreadFactory

実行中のスレッドが少ない場合corePoolSize、他のワーカー スレッドがアイドル状態であっても、すべての着信要求を処理するために新しいスレッドが作成されます。キープアライブはコア スレッドには適用されません。コア スレッドが作成されると、エグゼキュータは、キューがいっぱいになった場合にのみmaxPoolSize追加のスレッド (最大)を作成します。

maxPoolSize スレッドがあり、キューがいっぱいのときに新しいタスクが送信されると、そのタスクは拒否されます。「拒否」の動作は によって定義されますRejectedExecutionHandler。デフォルトでは、拒否ハンドラーはAbortPolicy(拒否時にランタイム RejectedExecutionException をスローする) です。そのようなポリシーを使用することが正しいかどうかを分析するか、別のポリシーを設定する必要がありますCallerRunsPolicy(つまりsubmit、キューに入れる代わりに、 を呼び出したスレッドでタスクを実行します)。

于 2013-03-19T11:36:46.147 に答える