/** @see net.gaia.taskprocessor.api.processor.Detenible#detener() */ public void detener() { detenido = true; // Primero cambiamos el estado de los workers para que terminen for (final ParallelWorker internalWorker : internalWorkers) { internalWorker.stopRunning(); } // Eliminamos las referencias para el GC internalWorkers.clear(); // Interrumpimos los threads para que no esperen más y terminen inmediatamente for (final Thread internalThread : internalThreads) { internalThread.interrupt(); } // Eliminamos las referencias para el GC internalThreads.clear(); // Cada thread cancela sus propias tareas pendientes }
/** * Inicializa los workers de este procesador creando también los threads necesarios. Y arranca los * threads * * @param cantidadDeWorkers Cantidad de workers y threads a crear */ @SuppressWarnings("unchecked") private void inicializarWorkers(final int cantidadDeWorkers) { // Factory para los threads a crear final ProcessorThreadFactory threadFactory = ProcessorThreadFactory.create("parallel", this); // Creamos el array compartido entre todos los workers this.colasCompartidas = new LinkedBlockingDeque[cantidadDeWorkers]; // Creamos las listas internas para los workers this.internalWorkers = new ArrayList<ParallelWorker>(cantidadDeWorkers); this.internalThreads = new ArrayList<Thread>(cantidadDeWorkers); for (int i = 0; i < cantidadDeWorkers; i++) { // Cada worker creado agrega una cola compartida al array final ParallelWorker workerCreado = ParallelWorker.create(i, colasCompartidas); internalWorkers.add(workerCreado); // Creamos también el thread para ejecutarlo final Thread threadCreado = threadFactory.newThread(workerCreado); internalThreads.add(threadCreado); } startThreads(); }