Планирование вызова по фиксированной ставке - PullRequest
9 голосов
/ 07 сентября 2011

У меня есть задача, которую я хочу выполнить с фиксированной скоростью.Однако мне также нужен результат задачи после каждого выполнения.Вот что я попробовал:

Задача

class ScheduledWork implements Callable<String>
{
    public String call()
    {
        //do the task and return the result as a String
    }
}

Нет, я пытался использовать ScheduledExecutorService для его планирования.Оказывается, вы не можете запланировать Callable с фиксированной ставкой, можно сделать только Runnable.

Пожалуйста, сообщите.

Ответы [ 2 ]

9 голосов
/ 07 сентября 2011

Использовать шаблон производителя / потребителя : пусть Runnable поместит своего результата в BlockingQueue .Иметь другой поток take () из очереди.

Take является блокирующим вызовом (т.е. возвращается только тогда, когда что-то находится в очереди), поэтому вы получите свои результаты, как только они станут доступны.

Вы можете объединить это с голливудский паттерн для предоставления ожидающему потоку обратного вызова, чтобы ваш код вызывался, когда что-то доступно.

0 голосов
/ 10 сентября 2011

Если вы не заботитесь о возвращаемом значении вашего Callable, вы можете заключить его в Runnable и использовать его для перехода к ScheduledExecutorService.

public static Runnable runnableOf(final Callable<?> callable)
{
    return new Runnable()
    {
        public void run()
        {
            try
            {
                callable.call();
            }
            catch (Exception e)
            {
            }
        }
    };
}

Тогда, когдаВы хотите отправить ScheduledExecutroService Вы можете передать свой Callable:

ses.scheduleAtFixedRate(runnableOf(callabale), initialDelay, delay, unit);
...