2016-09-07 3 views
0

Я хотел бы выполнять функцию каждые 4 секунды, и первый набор кода работает отлично, что «тестирование» печатается каждые 4 секунды. неПочему мое расписаниеAtFixedRate delay игнорируется?

ScheduledExecutorService SES = Executors.newSingleThreadScheduledExecutor(); 
      SES.scheduleAtFixedRate(new UpdateGraph(), 4, 4, TimeUnit.SECONDS); 

public class UpdateGraph implements Runnable { 
    @Override 
    public void run() { 
     Log.v("testing", "testing"); 
    } 
} 

Однако, если у меня есть для зацикливания внутри работоспособный, «тестирование» больше не задерживается, как я просил.

public class UpdateGraph implements Runnable { 
    @Override 
    public void run() { 
     for (int i = 0; i < numberOfFiles; i++) { 
      final double t = i; 
      final int y = i; 
      lineGraphPosture.addNewPoints(PointPosture.singlePoint(t, getNextX().get(y))); 
      graphView.repaint(); 
      Log.v("testing", "testing"); 
     } 
    } 
} 

Я понимаю, что проблема связана с циклом for, но не может понять, почему?

Пожалуйста, может кто-нибудь дать некоторые рекомендации =)

+0

Вы используете петлю. Конечно, все numberOfFiles будут распечатаны быстро. Они происходят без промедления между ними. –

+0

Что вы предлагаете, это правильный способ ввести daly между элементами numberOfFiles? – CWHsu

+0

'Thread.sleep'? –

ответ

0

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

Я бы посоветовал вам обернуть этот блок внутри try/catch и зарегистрировать возможное исключение.

0

Если вы хотите, чтобы ваш Runnable исполнялся только numberOfFiles раз, то неправильный выбор здесь запланированного исполнителя. Скорее возьмите SingleThreadExecutor и сделайте что-то вроде этого:

ExecutorService executor = Executors.newSingleThreadExecutor(); 
for (int i = 0; i < numberOfFiles; i++) { 
    executor.submit(runnable); 
    try { 
     executor.awaitTermination(4L, TimeUnit.SECONDS); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
Смежные вопросы