Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

229
Vistas
Cómo cerrar correctamente ScheduledExecutorService

Todavía estoy luchando para entender cómo trabajar con ScheduledExecutorService. Quiero tener un solo ScheduledExecutorService/ScheduledThreadPoolExecutor, que programa varias tareas y les permite ejecutar una cantidad fija de veces. Tan pronto como no se programen más tareas, quiero cerrar ScheduledThreadPoolExecutor. Estoy tratando de entender cómo podría funcionar esto escribiendo algunas pruebas. Lo primero que probé es lo siguiente:

 @Test public void testExecutorService() throws Exception { ScheduledThreadPoolExecutor executorService = new ScheduledThreadPoolExecutor(1); executorService.setRemoveOnCancelPolicy(true); CountDownLatch latchOne = new CountDownLatch(5); CountDownLatch latchTwo = new CountDownLatch(10); ScheduledFuture<?> scheduledFutureOne = executorService.scheduleAtFixedRate(new MyRunnerOne(latchOne), 0, 1, TimeUnit.SECONDS); ScheduledFuture<?> scheduledFutureTwo = executorService.scheduleAtFixedRate(new MyRunnerTwo(latchTwo), 0, 2, TimeUnit.SECONDS); latchOne.await(); scheduledFutureOne.cancel(false); latchTwo.await(); scheduledFutureTwo.cancel(false); System.out.println("Shutting down service..."); executorService.shutdown(); Thread.sleep(100); assertTrue(executorService.isTerminated()); } class MyRunnerOne implements Runnable { CountDownLatch latch; MyRunnerOne(CountDownLatch latch) { this.latch = latch; } @Override public void run() { System.out.println("Do Task One : " + latch.getCount()); latch.countDown(); } } class MyRunnerTwo implements Runnable { CountDownLatch latch; MyRunnerTwo(CountDownLatch latch) { this.latch = latch; } @Override public void run() { System.out.println("Do Task Two: " + latch.getCount()); latch.countDown(); } }

Esto funciona bien y obtengo el resultado esperado:

 Do Task One : 5 Do Task Two: 10 Do Task One : 4 Do Task One : 3 Do Task Two: 9 Do Task One : 2 Do Task One : 1 Do Task Two: 8 Do Task Two: 7 Do Task Two: 6 Do Task Two: 5 Do Task Two: 4 Do Task Two: 3 Do Task Two: 2 Do Task Two: 1 Shutting down service...

Sin embargo, esto solo funciona porque estoy esperando latchOne antes de esperar a latchTwo, ya que la primera tarea lleva menos tiempo. Si cambio este orden, es decir

 latchTwo.await(); scheduledFutureTwo.cancel(false); latchOne.await(); scheduledFutureOne.cancel(false);

La tarea uno se ejecutará aún más, incluso cuando el pestillo haya llegado a cero, porque solo se cancela después de la tarea dos. ¿Hay alguna manera de ejecutar algo (programadoFutureOne.cancel (falso) en este caso) tan pronto como el pestillo sea cero y hacerlo para varios pestillos a la vez?

También traté de seguir la configuración descrita en esta respuesta , que nuevamente funciona bien, pero no sé dónde/cómo cerraría ExecutorService. La configuración es similar, se aumenta un número entero atómico hasta alcanzar el número de invocaciones deseadas y luego cancelamos el futuro. Sin embargo, esto todavía no cierra ExecutorService.

TLDR Me gustaría programar varias tareas con un solo ExecutorService, cada una para un número fijo de invocaciones. Se debe permitir que el orden en que ExecutorService maneja las tareas sea aleatorio. Tan pronto como ya no se programen tareas, ExecutorService debe cerrarse.

Gracias chicos por cualquier idea :)

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Será más fácil de hacer si hace que las tareas se reprogramen en el servicio ejecutor:

 ScheduledThreadPoolExecutor executorService = new ScheduledThreadPoolExecutor(1); CountDownLatch latchOne = new CountDownLatch(1); CountDownLatch latchTwo = new CountDownLatch(1); executorService.submit(new MyRunnerOne(executorService, latchOne, 5)); executorService.submit(new MyRunnerTwo(executorService, latchTwo, 10)); latchTwo.await(); latchOne.await(); System.out.println("Shutting down service..."); executorService.shutdown(); executorService.awaitTermination(100, TimeUnit.SECONDS); System.out.println("Terminated: " + executorService.isTerminated()); //... class MyRunnerOne implements Runnable { private final ExecutorService service; private final CountDownLatch latch; private final int count; MyRunnerOne(ExecutorService service, CountDownLatch latch, int count) { this.service = service; this.latch = latch; this.count = count; } @Override public void run() { System.out.println("Do Task One : " + count); if (count > 1) { service.submit(new MyRunnerOne(service, latch, count - 1)); } else { latch.countDown(); } } }

Código completo .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda