Para mejorar la estabilidad de rendimiento del gran volumen de concurrencia en el proyecto, los grupos de subprocesos a menudo se usan para realizar operaciones asíncronas múltiples. Hay dos tipos de subprocesos múltiples. Una es implementar la interfaz Runnable, que no tiene valor de retorno, y el otro es implementar la interfaz invocable, que tiene un valor de retorno.
Cuando uno de los hilos se agotó, no debe afectar teóricamente los resultados de la ejecución de otros hilos, pero los problemas que surgen en el proyecto indican que un hilo está bloqueado y las interfaces devueltas por los otros hilos están vacíos. En realidad, es una pregunta muy simple, pero debido a que la encontré por primera vez, todavía lo pensé por un tiempo. Es muy simple, es por la línea de bloqueo
El proceso no se libera, y una vez que el monto de la concurrencia es grande, el número de piscinas de subprocesos estará llena, por lo que otros hilos están en un estado de espera.
Se adjunta un código de depuración que escribí yo mismo. Cuando no puedo pensar en un problema, lo simulé y tal vez el problema saldrá.
import java.util.concurrent.callable; import java.util.concurrent.executionException; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.future; import java.util.concurrent.timeunit; java.util.concurrent.timeOutException; public class Futuretest {public static void main (string [] args) lanza interruptedException, ExecutionException, TimeOutException {Final ExecutorService exec = Ejecutors.newFixedThreadPool (1); Callable <String> call = new Callable <String> () {public String Call () lanza interruptedException {// Comience a ejecutar la operación de tiempo que consumo el tiempo Thread.sleep (1000 * 2); devolver "1 ejecución de hilo completada"; }}; Callable <String> call2 = new Callable <String> () {public String Call () lanza la excepción {// Comience a ejecutar operación de tiempo que consiga // Thread.sleep (1000 * 5); return "Se completa la ejecución de 2 hilos"; }}; Callable <String> call3 = new Callable <String> () {public String Call () lanza la excepción {// Comience a ejecutar operación de tiempo que consiga // Thread.sleep (1000 * 5); return "Se completa la ejecución de 3 hilos"; }}; Futuro <String> futuro = exec.submit (call); Future <String> Future3 = Exec.SubMit (Call3); Futuro <String> futuro2 = exec.submit (call2); Cadena obj = ""; Cadena obj2 = ""; Cadena obj3 = ""; intente {obj = futuro.get (500, TimeUnit.MilliseConds); // Establecer el tiempo de espera de procesamiento de tareas en} // 1 segunda captura (excepción e) {system.out.println ("Tiempo de espera de procesamiento ..."); E.PrintStackTrace (); } try {obj3 = futuro3.get (3000, TimeUnit.milliseConds); // Establecer el tiempo de espera de procesamiento de tareas en} // 1 segunda captura (excepción e) {system.out.println ("Tiempo de espera de procesamiento ......"); E.PrintStackTrace (); } try {obj2 = futuro2.get (3000, TimeUnit.milliseConds);} Catch (Exception e) {System.out.println ("Tiempo de espera de procesamiento ..."); E.PrintStackTrace (); } System.out.println ("3 Tarea devuelve con éxito:" + obj3); System.out.println ("2 Tarea devuelve correctamente:" + obj2); System.out.println ("1 Tarea retorna correctamente:" + obj); exec.shutdown (); }}Lo anterior es la breve discusión de las excepciones de servicio causadas por el tiempo de espera asincrónico de múltiples subprocesos en Java. Espero que todos apoyen a Wulin.com más ~