Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

230
Visualizações
Cómo cerrar ThreadServiceExecutor donde inicialmente no se conoce la cantidad de subprocesos

Estoy en el proceso de escribir un código donde cada vez que se encuentra una carpeta se supone que debe iniciar un nuevo hilo. El código se ve como, p

 ublic void diff(File x,File y){ ThreadPoolExecutor executor=new ThreadPoolExecutor(10,30,2000,unit,BlockingQueue<Runnable> queue) if(x.isDirecotry && y.isDirectory){ Runnable thread=new DThread(x,y); Future<?> result=executor.submit(thread); if(result.isDone()){ LOGGER.debug(thread.toString()+"has completed"); }

Estoy usando ThreadPoolExecutor para este propósito. Si cierro el ThreadPoolExecutor, entonces no tomará ningún subproceso nuevo. Pero existe la posibilidad de que nuevos hilos comiencen después de comenzar. Si no cierro ThreadPoolExecutor, todos los subprocesos se ejecutan, pero al final, la JVM no finaliza. Por favor, ayuda, ¿cómo puedo cerrar el grupo de subprocesos solo cuando se ejecutan todos los subprocesos para que la JVM finalice? También sugiera si hay una mejor manera de implementar el grupo de subprocesos. Quiero usar el grupo de subprocesos para poder usar subprocesos del grupo en lugar de crear un nuevo subproceso cada vez.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Las cosas que está enviando no deben ser subprocesos (subtipos de subprocesos). Deben ser tareas simples: implementaciones de Runnable o Callable .

La forma de apagar el ejecutor es llamar a shutdown() o shutdownNow() en él. El resumen de javadoc dice:

void shutdown() : inicia un apagado ordenado en el que se ejecutan las tareas enviadas anteriormente, pero no se aceptarán tareas nuevas.

List<Runnable> shutdownNow() : intenta detener todas las tareas que se están ejecutando activamente, detiene el procesamiento de las tareas en espera y devuelve una lista de las tareas que estaban esperando su ejecución.

Este último intenta detener las tareas interrumpiéndolas. Sin embargo, si el código de tarea no busca interrupciones, se ejecutará hasta completarse. (También deja de aceptar nuevas tareas).


Parece que shutdown() hace lo que quieres hacer.


El problema radica en el hecho de dónde debo colocar el método de apagado.

Lo llamas cuando quieres empezar a cerrar.

Porque existe la posibilidad de que surjan nuevos subprocesos después de que se llame al apagado.

Deja de llamarlos hilos. son tareas .

Cualquier tarea que se envíe después de que se haya llamado a shutdown() se rechazará.

Mi pregunta es cómo puedo verificar si todas las tareas han terminado de ejecutarse y solo luego llamar al apagado. Si llamo con el inicio de cada tarea , no permitirá nuevas tareas más adelante.

El momento correcto para llamar a shutdown() es cuando su aplicación ha terminado de enviar tareas al ejecutor.

Tal vez su problema conceptual sea el alcance del servicio ejecutor. Su código de ejemplo parece mostrar que cada llamada a diff está creando un nuevo objeto de servicio. Eso significa que tendría muchos grupos de subprocesos independientes... y no reutilizaría los subprocesos. Lo que realmente debe hacer es crear un grupo de subprocesos "global" y tener varias llamadas para diff las tareas de envío al mismo grupo.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda