固定レートで実行するタスクをスケジュールするScheduledThreadPoolExecutorがあります。私はタスクが「成功する」まで最大10回の指定遅延で実行したい。その後、私はタスクを再試行したくありません。だから、基本的には、スケジューリングされたタスクの実行を停止する必要がありますが、ScheduledThreadPoolExecutorをシャットダウンする必要はありません。どのように私はそれをやろうと思った?完了したら、ScheduledThreadPoolExecutorでタスクを停止する方法
は、ここではいくつかの擬似コードだ -
public class ScheduledThreadPoolExecutorTest
{
public static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(15); // no multiple instances, just one to serve all requests
class MyTask implements Runnable
{
private int MAX_ATTEMPTS = 10;
public void run()
{
if(++attempt <= MAX_ATTEMPTS)
{
doX();
if(doXSucceeded)
{
//stop retrying the task anymore
}
}
else
{
//couldn't succeed in MAX attempts, don't bother retrying anymore!
}
}
}
public void main(String[] args)
{
executor.scheduleAtFixedRate(new ScheduledThreadPoolExecutorTest().new MyTask(), 0, 5, TimeUnit.SECONDS);
}
}
ありがとうございます!私は予定されていることを知っていましたが、私はこの方法を使用しようとしていました。 t = executor.scheduleAtFixedRate(new MyTask()、0、1、TimeUnit.SECONDS); t.cancel(true);明白な理由のために決して働かなかったであろう 。タスクの実装内でタスクをキャンセルするのは正しいことです。 – mystarrocks
ありがとうございます。これは助けになりました。興味深いことに、この例は決して終了しません。私はあなたがエグゼキュータのシャットダウンを必要とすると思います – Kirby
かわりに、CancellationExceptionのキャッチブロック内に 't.get()'とエグゼキュータのシャットダウンが必要です – Kirby