7

ほとんどのタスクに対して異なるレートで定期的に実行したいタスクがいくつかあります。ただし、一部のタスクは同時実行用にスケジュールされている場合があります。また、別のタスクが現在実行されている間に、タスクの実行を開始する必要がある場合もあります。

また、実行中にタスクが動作するオブジェクトを設定して、各タスクをカスタマイズしたいと思います。

通常、タスクは 2 ~ 30 分の間隔で実行され、約 4 ~ 5 秒、場合によっては実行時に最大 30 秒かかります。

Executors.newSingleThreadedScheduledExecutor(ThreadFactory)別のタスクが既に実行されている間に新しいタスクの実行がスケジュールされた場合に問題が発生する可能性があることを除いて、私はほぼ正確に私が望むものであることがわかりました。これは、Executor が単一の実行スレッドによってバックアップされるためです。

別の方法として を使用することExecutors.newScheduledThreadPool(corePoolSize, ThreadFactory)もできますが、これにはプール内に多数のスレッドを作成する必要があります。たとえば、実行スケジュールが衝突するために並列実行が必要になる 2 つ以上のタスクがある場合など、必要になるまでスレッドの作成を避けたいと思います。

上記の場合、 はExecutors.newCachedThreadPool(ThreadFactory)希望どおりに動作しているように見えますが、タスクをスケジュールできません。キャッシュされたエグゼキュータとスケジュールされたエグゼキュータの両方の組み合わせが最善だと思いますが、Java でそのようなものを見つけることができません。

上記を実装する最良の方法は何だと思いますか?

4

2 に答える 2

1

SynchronousQueueを作業キューとして使用する場合にDelayedWorkQueueScheduledExecutorを使用するため、 ではそれを行うことができないと思います。newCachedThreadPoolThreadPoolExecutor

そのため、 ScheduledThreadPoolExecutorの実装をそのように変更することはできません。

于 2012-10-04T09:23:14.493 に答える
1

ではないScheduledThreadPoolExecutor.ScheduledThreadPoolExecutor(int):

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(0);

何が必要?0corePoolSize:

corePoolSizeallowCoreThreadTimeOut-設定されていない限り、アイドル状態であってもプールに保持するスレッドの数

于 2012-10-04T08:22:20.723 に答える