30

固定レートで実行するタスクをスケジュールする ScheduledThreadPoolExecutor があります。タスクが「成功」するまで、指定された遅延で最大 10 回実行する必要があります。その後、タスクを再試行したくありません。基本的に、スケジュールされたタスクを停止したい場合は、スケジュールされたタスクの実行を停止する必要がありますが、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);
  }
}
4

3 に答える 3

46

このテストを実行すると、印刷1 2 3 4 5されて停止します

public class ScheduledThreadPoolExecutorTest {
    static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(15); // no
    static ScheduledFuture<?> t;

    static class MyTask implements Runnable {
        private int attempt = 1;

        public void run() {
            System.out.print(attempt + " ");
            if (++attempt > 5) {
                t.cancel(false);
            }
        }
    }

    public static void main(String[] args) {
        t = executor.scheduleAtFixedRate(new MyTask(), 0, 1, TimeUnit.SECONDS);
    }
}
于 2013-02-15T06:22:40.467 に答える