Domanda

Descrizione

Un compito A è in esecuzione, che può durare da 2 a 60+s.

Mentre A è in esecuzione, ho programmato un servizio esecutivo che dopo 10s (ritardo) stamperei "in esecuzione" ogni 5S (tariffa fissa).

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

Una volta che A è finito, desidero stampare "A è fatto". Ma solo se è avviata la mia attività programmata, nel senso che ha stampato "in esecuzione" almeno una volta.

  • Se un finito prima dei 10 anni, non stampino nulla.
  • Se A richiede più di 10 secondi, stampano "correndo" ogni 5s e poi "fatto" una volta che è finito.

Come potrei farlo senza usare una bandiera booleana all'interno dello schduled runnable. C'è un modo per verificare che il mio servizio sia iniziato?

È stato utile?

Soluzione

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.");
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top