Red de conocimiento informático - Aprendizaje de programación - Código fuente del grupo de subprocesos de Java.

Código fuente del grupo de subprocesos de Java.

¿importar? Lista de utilidades de Java;

¿Importar? Java . util . concurrente invocable;

¿Importar? Java . util . excepción de ejecución concurrente;

¿Importar? Java .util .concurrent .executorservice;

¿Importar? Java . util . ejecutores concurrentes;

¿Importar? Java . util . concurrent .futuro;

/**

*? Programa de procesamiento paralelo

*? /p >

*?Cola de tareas? Hay 150 tareas que deben procesarse simultáneamente. Con este objeto, se puede ejecutar simultáneamente 20 veces cada vez (se puede configurar), luego el número total de ejecuciones simultáneas es * * * veces y se pueden obtener los resultados de la ejecución.

*

*?@param? <T>? El tipo T restringe el objeto de datos utilizado para la llamada de tarea al mismo bean que el objeto de datos que devuelve el resultado.

*/

¿Público? ¿clase? ¿Ejecutando simultáneamente programas& ltT & gt

{

/**? ¿No están vacías, todas las matrices de tareas? */

¿Privado? Callable & ltT & gt[]?Task;

/**? no está vacío ¿Cuántas tareas deben procesarse a la vez? */

¿Privado? int? Numb;

/**? Alternativamente, almacene el resultado devuelto. Aquí hay una limitación. La T genérica debe ser el tipo T devuelto por Callable. */

¿Privado? lista<T>? Resultado;

/**

*? Estructura sin parámetros

*/

¿Público? Programa de ejecución concurrente()

{

super();

}

/**

* Úselo para crear objetos para tareas que no necesitan devolver resultados.

*?@param? Tarea

*?@param? Entumecido

*/

¿Público? ejecutor concurrente(Invocable & lt; T & gt[]? tarea,? int? número)

{

super();

¿Esta tarea? =?Tarea;

¿Esto. =?numb;

}

/**

*?Necesita conjuntos de resultados para crear objetos de esta manera.

*?@param? Tarea

*?@param? Entumecido

*?@param? Resultado

*/

¿Público? ejecutor concurrente(Invocable <T>[]?Tarea,?int?Número,?Lista<T>?Resultado)

{

super();

p>

¿Esta tarea? =?Tarea;

¿Esto. =?Entumecido;

¿Este. =?Resultado;

}

¿Público? ¿Vacío? ejecutar()

{

//?Comprobación de parámetros

if (tarea?==?null?||?numb?<?1)< / p>

{

Retorno;

}

//?El número de tareas a procesar

int? número? =?Tarea.Longitud;

Si (num?==?0)

{

Devolver;

}

//?En el primer ciclo, cada dato se trata como un número concurrente.

for(int?I = 0;?i<(int)math . piso(num/num)?+?1;?i++)

{

//? Se utiliza para registrar los resultados del procesamiento de esta tarea numerada.

¿Futuro[]? FutureArray

if (¿numb? & gt? número)

{

futureArray? =?¿Nuevo? Futuro[número];

}

Otro

{

futuroArray? =?¿Nuevo? Futuro[número];

}

//?Crear un contenedor de subprocesos

¿Ejecutar servicio? es? =?executors . newcachedthreadpool();

//?El segundo bucle se utiliza para procesar datos numéricos.

for(int?j = I * número;?j & lt(I+1)* número;?j++)

{

//? Si se excede la longitud de la matriz, salga del ciclo.

Si (j?+?1?& gt?número)

{

Descanso;

}

//?Ejecute la tarea y coloque el futuro en la matriz.

futuroArray[j % número]? =?es .submit(tasks[j]);

}

//?Pon el resultado en el resultado

Si? (¡¿Resultado?! =? Vacío)

{

¿Para qué? (int?j?=?0;?j?<?futureArray.length?j++)

{

Probar

{

if(futureArray[j]?!=?null)

{

¿Objeto? oh? =?futuroArray[j]. get();

resultado . add((T)o);

}

}

¿Capturar? (¿Excepción interrumpida? e)

{

System.out.println("Se produjo una excepción interrumpida al procesar el futuro, el futuro objetivo es:?"?+?futureArray[j]. toString());

e. printstacktrace();

}

¿Capturar? (ExecutionException?e)

{

System.out.println("Se produjo una excepción de ejecución al procesar el futuro, el futuro objetivo es:?"?+?futureArray[j].toString ( ));

e . printstacktrace();

}

}

}

es . cerrar();

}

}