Pergunta

Descrição

Uma tarefa A está em execução, que pode durar de 2s a 60+s.

Enquanto A está em execução, eu agendava um executores de que após 10s (atraso) imprimiria "executando" a cada 5s (taxa fixa).

ScheduledExecutorService scheduleNotifications = Executors
        .newSingleThreadScheduledExecutor();
scheduleNotifications.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        System.out.println("A is running");
    }
}, 10, 5, TimeUnit.SECONDS);

Depois que A é feito, desejo imprimir "A está pronto". mas somente se minha tarefa agendada de excesso de serviço, o que significa que ele imprimiu "Running" pelo menos uma vez.

  • Se terminar antes dos 10s, não imprimi nada.
  • Se A toma mais de 10s, imprimirá "Running" a cada 5s e depois "feito" quando A terminar.

Como eu poderia fazer isso sem usar uma bandeira booleana dentro do schduled runnable. Existe uma maneira de verificar se meu serviço começou?

Foi útil?

Solução

ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(1);
scheduler.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        System.out.println("A is running");
    }
}, 10, 5, TimeUnit.SECONDS);

Thread.sleep(20000);
scheduler.shutdown();
if (scheduler.getCompletedTaskCount() > 0) {
    System.out.println("A is done.");
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top