3

java.util.concurrent単純なポーリングクラスにパッケージを使用することを検討しています。これを行うために利用できるクラス、インターフェイス、およびメソッドの範囲に少し戸惑っているので、いくつかのガイダンスをいただければ幸いです。これまでの私の考えは次のとおりです。

最初に決定するのは、スケジュールを管理するためにクラスをインスタンス化する方法です。いくつかの可能なオプションがあります。例:

ScheduledThreadPoolExecutor scheduledThreadPoolExecutor =
    new ScheduledThreadPoolExecutor(corePoolSize)

...また...

ScheduledExecutorService scheduledExecutorService =
    Executors.newSingleThreadScheduledExecutor();

...また...

ScheduledExecutorService scheduledExecutorService =
    Executors.newScheduledThreadPool(corePoolSize);

最後のものに傾いていますが、賢明なcorePoolSizeが何であるか疑問に思っています-物事を単純に保つためにおそらく1ですか?

編集:最終的に、topメソッドを使用する(つまり、 ScheduledThreadPoolExecutor を直接インスタンス化する)ことで最もメリットがあります。ThreadPoolExecutorgetActiveCount()は、アクティブなスレッドの数を取得するために提供されます。pause()これにより、一時停止が実際に有効になるまで待機するメソッドを実装できました。説明を参照してください。

次の決定は、呼び出すかどうかscheduleAtFixedRateですscheduleWithFixedDelayscheduleWithFixedDelay()ポーリングの規則性はそれほど重要ではなく、ボトルネックの後に複数のポーリングがすばやく連続して発生するという考えは好きではないので、傾いています。

しかし、ここに質問があります。ポーリングを開始し、スレッドを表す単一のクラスを使用することは問題ありませんか?例えば:

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回呼び出すことができないため、確実に機能しませんか?

4

2 に答える 2

4

他の人がコメントしているように、変更する必要があるのは Thread to Runnable だけです。複数のタスクが実行されないように、セーフ ガードを追加することをお勧めします。

public class Poller implements Runnable {
    final ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
    Future future = null;

    @Override
    public void run() {
        ...
    }

    public void startPolling() {
        if (future != null && !future.isDone()) {
           future.cancel(true); // stop before restarting
           // or
           return; // already running
        }
        future = exec.scheduleWithFixedDelay(this, 0, 5000, TimeUnit.MILLISECONDS);
    }
}

ところで: Java 5.0 を使用している場合、run()メソッドには@Override. Java 6+ の場合、@Override が必要です。

このクラスの新しいインスタンスは、実行ごとにインスタンス化されますか?

new演算子を使用すると、新しいインスタンスが作成されます。

そうしないと、確実に機能しません run() 同じ Thread インスタンスで2回呼び出すことはできませんか?

作成したスレッドが使用されていないため、コードで Thread を使用すると混乱するため、機能する可能性があります。である必要がありますRunnable

于 2012-12-18T15:33:31.857 に答える
2

シングルスレッドアプローチでは、次のPollerような実装を使用できます。

public class Poller implements Runnable {
    public void run() {
        while ( mayContinue ) {
            poll();
            Thread.sleep(5000);
        }
    }
}
于 2012-12-18T15:39:19.460 に答える