web-dev-qa-db-fra.com

Comment arrêter un ScheduledExecutorService?

Le programme se termine après neuf impressions:

class BeeperControl {

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public void beep() {
        final Runnable beeper = new Runnable() {
            public void run() {
                System.out.println("beep");
            }
        };
        final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(
                beeper, 1, 1, SECONDS);
        scheduler.schedule(new Runnable() {
            public void run() {
                beeperHandle.cancel(true);
            }
        }, 1 * 9, SECONDS);
    }

    public static void main(String[] args) {
        BeeperControl bc = new BeeperControl();
        bc.beep();
    }
}

Comment arrêter un processus (i.e. Java processus dans Eclipse par exemple) car il ne s'arrête pas après un délai de 9 secondes?

14
ferro

Le problème que vous avez est que le planificateur conserve un fil en direct après avoir annulé la tâche de bip.

S'il existe un thread non démon actif, la JVM reste active.

La raison pour laquelle il conserve ce fil est que vous lui avez dit de le faire dans cette ligne:

private final ScheduledExecutorService scheduler
        = Executors.newScheduledThreadPool(1);

Notez la documentation de newScheduledThreadPool(int corePoolSize):

corePoolSize - le nombre de threads à conserver dans le pool, même s'ils sont inactifs.

Ainsi, vous avez deux façons possibles de provoquer l'arrêt de la JVM:

  1. Passez 0 À newScheduledThreadPool au lieu de 1. Le planificateur ne conservera pas de thread actif et la JVM se terminera.

  2. Arrêtez le planificateur. Vous êtes censé le faire de toute façon pour libérer ses ressources. Modifiez donc le run dans votre Runnable anonyme en:

    public void run() {
        beeperHandle.cancel(true);
        scheduler.shutdown();
    }
    

(En fait, vous n'avez pas besoin du cancel - le shutdown prendra effet dès que le prochain "bip" sera terminé.)

20
RealSkeptic