Задача таймера работает неправильно

Я использую задачу таймера для выполнения асинхронной задачи с фиксированным интервалом времени в пять минут. но задача таймера иногда начинала вести себя неправильно, как будто она не выполнялась с фиксированной задержкой, на самом деле она выполнялась через 10 минут дважды, а не каждые 5 минут, почему так?

Вот мой код

    Timer timer = new Timer();
            mytimer Mytimer = new mytimer();

            timer.scheduleAtFixedRate(Mytimer, 300000, 300000);


class Mytimer extends TimerTask {
        @Override
        public void run() {
            // TODO Auto-generated method stub

            new DetailPosition().execute();
        }
    }

Так помогите мне в этом


person Edward    schedule 10.08.2015    source источник
comment
Разместите свой код. И для начала вам, вероятно, вообще не следует использовать Timer. Способ Android делать что-то через определенные промежутки времени — через Handler#postDelayed(...).   -  person Kevin Krumwiede    schedule 10.08.2015
comment
@KevinKrumwiede Добавьте рассматриваемый код, пожалуйста, проверьте его ..   -  person Edward    schedule 10.08.2015
comment
Мне нравится слово "неправильный" :)   -  person Narendra Singh    schedule 10.08.2015
comment
В документах указано, что экземпляр задачи должен быть создан в потоке пользовательского интерфейса. и execute(Params...) должен вызываться в потоке пользовательского интерфейса. Вы нарушаете оба этих правила. Откажитесь от Timer и используйте Handler.   -  person Kevin Krumwiede    schedule 10.08.2015


Ответы (1)


Если задача таймера запланирована для пула потоков, в котором все потоки используются, то ей придется подождать, пока один из них станет доступным, прежде чем запускать вашу задачу.

Рассмотрим следующее -

 ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();    
ses.scheduleAtFixedRate(() -> {Thread.sleep(500); System.out.println(new Date());}, 0, 200, TimeUnit.MILLISECONDS);

Здесь задача занимает больше времени, чем интервал, поэтому задачи просто будут стоять в очереди, пока у вас не закончится память.

person George Simms    schedule 10.08.2015
comment
Я согласен с этим сценарием, но иногда таймер выполняется один раз, и я одновременно получаю две записи на сервере с разными данными, и он не печатает журналы в журнале выполнения его дважды одновременно. - person Edward; 10.08.2015
comment
@ Эдвард, ты используешь тот же пул потоков для чего-то еще, что может его задушить? - person George Simms; 10.08.2015
comment
я использую это в службе, и я не знаю, как проверить пул потоков, поэтому, пожалуйста, скажите мне, тогда я проверю и дам вам знать. - person Edward; 10.08.2015