1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Agendamento de Tarefas

Bom dia pessoal,

tenho um player de vídeos e preciso agendar a exibição de alguns streamings da internet. Nesse player existe um playlist separado para os itens que não estão agendados. Toda vez que chega a hora de tocar um vídeo agendado eu paro a execução do vídeo que está sendo executado e executo o streaming agendado.

O tempo de duração do streaming é definido pelo usuário. Qd chegar ao limite de duração preciso chamar o próximo vídeo da lista de não agendados. O que eu fiz foi agendar também a saída do streaming.

Estou agendando dois streamings diferentes S1 e S2:

  • S1 - começa 10:20 tem duração de 5 min - logo deveria sair às 10:25
  • S2 - começa 10:22 tem duração de 5 min - logo deveria sair às 10:27

E tenho dois problemas:

  1. O streaming S1 está sendo agendado duas vezes às 10:20 e 10:22. Entra o mesmo Streaming nos dois horários
  2. O agendamento de saída está ocorrendo duas vezes. Quando S2 começar o agendamento de saída de S1 ás 10:25 deveria ser cancelado.

Segue abaixo a classe que estou usando para fazer o agendamento.

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * tem como propósito agendar tarefas thread-safe e evitar que chamadas sequências 
 * tenham de esperar a liberação de algum recurso ou o término de uma thread
 */

public class Scheduler {

    /**
     * segundo entendi é o número de threads que o serviço de agendamento usa
     * quanto maior o número de threads mais recursos são usados
     */
    private static final int NUM_THREADS = 1;

    /**
     * instancia do serviço agendador
     */
    private ScheduledExecutorService service;

    /**
     * trava de execução
     */
    private boolean locked = false;

    /**
     * retorna se há alguma execução em andamento
     * se há uma trava existe uma execução em andamento
     * @return boolean
     */
    public boolean running()
    {
        return locked;
    }

    /**
     * cria trava
     */
    public void lock()
    {
        locked = true;
    }

    /**
     * remove trava
     */
    public void unlock()
    {
        locked = false;
    }

    /**
     * Executa uma determinada função após um período de tempo
     * @param task interface runnable com a ação a ser executada
     * @param long num tempo que deve aguardar para executar a ação
     * @param TimeUnit unit unidade de tempo
     * 
     * Nota sobre o período de tempo (num):
     * 
     * É a quantidade de tempo e não o horário em que a função será chamada
     */
    public void schedule(final ScheduleTask task, long num, TimeUnit unit) {
        service = Executors.newScheduledThreadPool(NUM_THREADS);
        service.schedule(new Runnable() {

            public void run() {
                lock();
                task.run();
            }
        }, num, unit);
    }

    /**
     * Executa uma determinada função após um período de tempo
     * @param ScheduleTask task interface runnable com a ação a ser executada
     * @param ScheduleTime time período de tempo antes que uma função é executada
     */
    public void schedule(final ScheduleTask task, ScheduleTime time) {   
        schedule(task, time.value(), time.unit());
    }

    /**
     * Executa uma determinada função após um período em segundos
     * @param ScheduleTask task interface runnable com a ação a ser executada 
     * @param long sec tempo em segundos para execução da tarefa
     */
    public void schedule(final ScheduleTask task, long sec) {
        schedule(task, sec, TimeUnit.SECONDS);
    }
}

Como faço o agendamento. Eu uso instancias diferentes da classe Scheduler para agendar a entrada e saída do streaming.

ScheduleTask task = new ScheduleTask() {

    @Override
    public void run() {
        System.out.println("Tocando conteúdo agendado. " + schedulerElem.getText());
        listener.picked(schedulerElem);                                                
    }
};

scheduler.schedule(task, scheduleTime);


scheduler.schedule(new ScheduleTask() {                        
    @Override
    public void run() {
        System.out.println( "Removendo do conteúdo  do palco");
        manager.next();
    }
}, schedulerElem.duration());
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java threads ou faça a sua própria pergunta.