4

次のクラスがあるとします。

public class Poller implements Runnable {
    public static final int CORE_POOL_SIZE = 4;

    public boolean running;
    public ScheduledExecutorService ses;

    public void startPolling() {
        this.ses = Executors.newScheduledThreadPool(CORE_POOL_SIZE);
        this.ses.scheduleAtFixedRate(this, 0, 1, TimeUnit.SECONDS);
    }

    public void run() {
        running = true;
        // ... Do something ...
        running = false;
    }
}

ScheduledExecutorServiceコア スレッド プール サイズは 4 ですが、複数のポーラー スレッドが作成されることはありますか? thisに渡されるので、それはscheduleAtFixedRateスレッドが 1 つしか存在しないことを意味しますか? それとも、より複雑なことが舞台裏で発生しますか?

2 つのおまけの質問:-

  1. runningする必要がありstaticますか?
  2. CORE_POOL_SIZE冗長ですか?
4

3 に答える 3

4

ScheduledExecutorService のコア スレッド プール サイズは 4 ですが、複数のポーラー スレッドが作成されることはありますか?

プログラムを十分に長く実行すると、おそらく 4 つのスレッドが作成されます。スケジュールされたタスクを 1 回か 2 回だけ実行した後に終了すると、2 つまたは 3 つのスレッドしか表示されない場合があります。

なぜそれが重要なのですか?

スレッドの作成を監視する 1 つの方法は、独自の を提供することThreadFactoryです。

this.ses = Executors.newScheduledThreadPool(CORE_POOL_SIZE, new ThreadFactory() {

            @Override
            public Thread newThread(Runnable r) {
                System.out.println("Creating thread");
                return new Thread(r);
            }
        }); 

ランニングは静的であるべきですか?

それはあなたが達成したいことに依存します...あなたは実際にあなたの例でそれを使用していないので、言うのは難しいです. たとえば、ポーラーのインスタンスが複数あり、それらを同時に実行したくない場合は、静的にする必要があるかもしれません。

静的であるかどうかに関係なく、フラグとして使用する場合は、可視性を確保するために揮発性にする必要があります。

CORE_POOL_SIZE は冗長ですか?

よく分からない。これは必須パラメーターであるため、値を指定する必要があります。2 つの実行が同時に実行されないことが確実にわかっている場合は、スレッドを 1 つだけにすることができます。これにより、同時実行も防止されます (したがって、1 つのスケジュールされたタスクを開始する必要があるが、別のタスクが既に実行されている場合、新しいタスクは遅延します)。

于 2013-03-15T10:20:29.977 に答える
3

scheduleAtFixedRate(実行可能、長いinitialDelay、長い期間、TimeUnitタイムユニット)

このメソッドは、タスクが定期的に実行されるようにスケジュールします。タスクは、initialDelayの後に最初に実行され、その後、期間が終了するたびに繰り返し実行されます。

指定されたタスクの実行で例外がスローされた場合、そのタスクは実行されなくなります。例外がスローされない場合、ScheduledExecutorServiceがシャットダウンされるまでタスクは実行され続けます。

タスクの実行にスケジュールされた実行間の期間よりも時間がかかる場合、次の実行は現在の実行が終了した後に開始されます。スケジュールされたタスクは、一度に複数のスレッドによって実行されることはありません。

于 2013-03-16T04:27:00.827 に答える
1

Runnableエグゼキュータ サービスをクラスに入れるのはなぜですか? ScheduledExecutorService実行可能なクラスの変数ではなく、シングルトンとして分離する必要があります。

これScheduledExecutorServiceはスレッド コンテナーであることを思い出してください。

this.ses = Executors.newScheduledThreadPool(CORE_POOL_SIZE);

このコードを配置すると、同時にサイズの値に基づいて多くのスレッドが作成されます

this.ses.scheduleAtFixedRate(this, 0, 1, TimeUnit.SECONDS);

これは、ScheduledExecutorService終了するまで 1 秒ごとにこのクラスを実行するためにアイドル状態になっているスレッドをランダムに選択します。sleepperiod time の値よりも長い run メソッドをスケジュールされたスレッドに渡すと、最初のスレッドが終了するまで別のスレッドを作成しません。したがって、複数のスレッドでこれPollerを同時に実行する場合は、複数のPollerインスタンスを作成してに渡しますScheduledExecutorService

CORE_POOL_SIZE私にとっては冗長ではありません。構成ファイルから取得した値を定数にするのは良いことです。

ランニングは静的であるべきですか?それはあなたが必要とするものに依存します。複数のインスタンスを作成する場合はPoller、すべきではありません

于 2013-03-15T11:06:59.643 に答える