Este artículo explora principalmente el uso de la programación concurrente de Java llamable y el futuro, y comparte códigos de ejemplo relevantes, y los detalles son los siguientes.
Todos sabemos que hay dos formas de implementar múltiples subprocesos. Una es heredar el hilo y el otro es implementar Runnable. Sin embargo, ambas dos formas tienen un defecto, y el resultado de retorno no se puede obtener después de que se complete la tarea. Para obtener el resultado de devolución, debe usar la llamada. La tarea llamable puede tener un valor de retorno, pero no puede obtener directamente el valor de retorno de la tarea invocable; Si desea obtener el valor de retorno de la tarea invocable, debe usar Future. Por lo tanto, las tareas invocables y el modo futuro generalmente se usan en combinación.
Imagine un escenario: necesita una interfaz de la lista de publicaciones. Además de devolver la lista de publicaciones, también debe devolver la lista similar y la lista de comentarios de cada publicación. Para los cálculos de 10 publicaciones en una página, esta interfaz requiere acceso a la base de datos 21 veces. Una vez que acceder a la base de datos se calcula en función de 100 ms, 21 veces y el tiempo acumulativo es de 2.1s. Este tiempo de respuesta probablemente no sea satisfactorio. ¿Qué hacer? Transformación asincrónica de interfaces.
Después de descubrir la lista de publicaciones, iterar sobre la lista de publicaciones, comenzar 10 subprocesos en el bucle y obtener simultáneamente la lista similar de cada publicación, y al mismo tiempo, se configuran 10 hilos para obtener la lista de comentarios de cada publicación. Después de esta transformación, el tiempo de respuesta de la interfaz se acorta en gran medida a 200 ms. En este momento, necesitamos usar Callabel combinado con Future para lograrlo.
Lista privada <Stresponse> CreatePosTesponSeList (Page <Stresponse> Page, Final String UserId) {if (page.getCount () == 0 || Page == NULL || Page.getList () == NULL) {return null; } // Obtenga la lista de publicaciones <PostTesponse> CIRCLERESPONSELIST = Page.getList (); int size = CIRCLERESPONSELIST.SIZE (); EjecutorService commentpool = Ejecutors.NewFixedThreadPool (tamaño); EjecutorService SupportPool = Ejecutors.NewFixedThreadPool (tamaño); Pruebe {List <Seure> CommentFuTureList = New ArrayList <Eutree> (size); if (CIRCLERESPONSELIST! = NULL && CIRCLERESPONSELIST.SIZE ()> 0) {for (postresponse postresponse: circlerponseList) {final string circleId = postresponse.getId (); Final String PostUserId = postresponse.getUserId (); // Verifique la lista de comentarios llamable <List <DirCleReviews>> CallableComment = new Callable <List <Circlereviews>> () {@Override Public List <Circlereviews> call () lanza excepción {return circlereviewsbiz.getPostComments (círculo); }}; Futuro f = commentpool.submit (CallableComment); commentFutureList.Add (f); // Verifique la lista de LIKE Callable <list <circlezan>> callableUpport = new Callable <list <circleZan> () {@Override Public List <circleZan> call () lanza la excepción {return circleZanbiz.findList (circleId); }}; Future SupportFuture = Supportpool.submit (CallableUpport); commentFutureList.Add (SupportFuture); }} // Obtenga los resultados de ejecución de todas las tareas concurrentes int i = 0; Postresponse temp = null; para (Future F: CommunteFutureList) {temp = CircleresponseList.get (i); temp.setCommentList ((list <cirCleReViews>) f.get (); temp.setsUpportList ((list <circleZan>) f.get (); circleresponseList.set (i, temp); i ++;}} Catch (excepción e) {E.PrintStackTrace ();} SupportPool.shutdown ();Resumir
Lo anterior es todo el contenido de este artículo sobre el código de ejemplo de la aplicación de programación concurrente Java que se puede llamar y Future. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!