java.util.concurrent
単純なポーリングクラスにパッケージを使用することを検討しています。これを行うために利用できるクラス、インターフェイス、およびメソッドの範囲に少し戸惑っているので、いくつかのガイダンスをいただければ幸いです。これまでの私の考えは次のとおりです。
最初に決定するのは、スケジュールを管理するためにクラスをインスタンス化する方法です。いくつかの可能なオプションがあります。例:
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor =
new ScheduledThreadPoolExecutor(corePoolSize)
...また...
ScheduledExecutorService scheduledExecutorService =
Executors.newSingleThreadScheduledExecutor();
...また...
ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(corePoolSize);
最後のものに傾いていますが、賢明なcorePoolSizeが何であるか疑問に思っています-物事を単純に保つためにおそらく1ですか?
編集:最終的に、topメソッドを使用する(つまり、 ScheduledThreadPoolExecutor を直接インスタンス化する)ことで最もメリットがあります。ThreadPoolExecutorgetActiveCount()
は、アクティブなスレッドの数を取得するために提供されます。pause()
これにより、一時停止が実際に有効になるまで待機するメソッドを実装できました。説明を参照してください。
次の決定は、呼び出すかどうかscheduleAtFixedRate
ですscheduleWithFixedDelay
。scheduleWithFixedDelay()
ポーリングの規則性はそれほど重要ではなく、ボトルネックの後に複数のポーリングがすばやく連続して発生するという考えは好きではないので、傾いています。
しかし、ここに質問があります。ポーリングを開始し、スレッドを表す単一のクラスを使用することは問題ありませんか?例えば:
public class Poller extends Thread {
@Override
public void run() {
...
}
public void startPolling() {
ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
exec.scheduleWithFixedDelay(this, 0, 5000, TimeUnit.MILLISECONDS);
}
}
ここでよくわからない主な部分は、最初のscheduleWithFixedDelay()
パラメーターです。このクラスの新しいインスタンスは、実行ごとにインスタンス化されますか?そうしないと、run()を同じスレッドインスタンスで2回呼び出すことができないため、確実に機能しませんか?