Contexte: Un système d'application a été développé au sein du gouvernement. La fonction principale est de permettre à l'entreprise de remplir les informations de qualification d'entreprise, puis d'utiliser la formule donnée pour compter cette série d'informations, et de les afficher aux leaders du gouvernement sous forme de scores. Actuellement, 1 300 entreprises remplissent le rapport. Étant donné que le score est affiché en temps réel, la fonction statistique est lente.
Processus en cours d'exécution du code :
1. Découvrez 1300 informations d'entreprise
2. Traverse 1300 Informations d'entreprise et calculer les informations de score de chaque entreprise. Chaque entreprise devrait avoir un temps de 0,3 seconde. Total 390 secondes. Provoque le délai d'expiration de la demande de page
3. Exportation (en utilisant JXL JAR)
Solution:
Puisqu'il gère les affaires, il est nécessaire d'avoir des threads qui peuvent renvoyer des valeurs. Utilisation: appelant
Téléchargez directement le code
1. Le code qui appelle le thread
List <map <string, objet >> list = (list <map <string, object >>) map.get ("lignes"); int taskSize = 20; // créer un pool de thread exécutorService pool = exécutors.newFixEdThreadpool (taskSize); // créer plusieurs tasks avec des valeurs de retour <futur> listfuture = new ArrayList <Vuture> (); pour (intes i = 0; i <tasksize); {System.out.println ("i activer le Lalala multithreading"); int evgCount = list.size () / taskSize; Calable C = new myCallable (list.sublist (evgCount * i, evgCount * (i + 1)), session, staticflag, décerned the taskastervice, letepriederrey Obtenez le futur objet futur f = pool.submit (c); listfuture.add (f);} pool.shutdown (); // obtenez les résultats en cours d'exécution de toutes les tâches simultanées <Map <String, objet >> Listresult = New ArrayList <Map <String, objet >> (); pour (future f: listfuture, {list <map <string, objet >> ListModmel = New ArayLiSe <Map <Map <Map <String, objet >> Objet >> (); try {listModel = (list <map <string, objet >>) f.get ();} catch (InterruptedException e) {e.printStackTrace ();} Catch (ExecutionException e) {e.printStackTrace ();} ListreSult.Addall (listModel);} map.put ("rows", Lstreult);2. Code de thread
package usi.jszx.controller; import java.util.list; import java.util.map; import java.util.concurrent.callable; import javax.servlet.http.httpSession; import org.apache.commons.scorrem; usI.jszx.service.declalemasterservice; import usi.jszx.service.declareservice; import usi.jszx.service.declareservice; import usi.jszx.service.enterprisequereservice; import usi.sys.dto.authinfo; import; usi.sys.util.constantutil; Class MyCallable implémente callable <objet> {// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- MyCallable (list <map <string, objet >> liste, session httpSession, String staticflag, déclarations de déclaration, de déclarations de disposition Declareservice; this.declalemAsterService = DeclatemAsterService; this.enterprisequeryService = EnterpriseQueryService;} @ OverRidepublic Object Call () lève une exception {Authinfo info); pour (Authinfo) session.getAttribute (ConstronTUtil.Auth_info); pour (int i = 0; i list.Size (); {Map <string, objet> maplist = list.get (i); string mainid = maplist.get ("id") + ""; this.grademaster (session, mainid, maplist.get ("orgid") + "", declatemasterservice, enterprisequeryService); list <map <string, objet >> listScore = DeclatemAsterService.QueryScoremain (maplist.get ("id") + "", info.getRightType (), "rapport"); // declatemasterservice.QuerysCoremain (MainId, info.getRightType (), iSReport); int isdouble = 1; if (listScore.Size ()> 30) {maphut. " listScore.get (46) .get ("score")); isDouble = 2;} else if (listScore.size ()> 22) {maplist.put ("soctotal", listScore.get (23) .get ("score"));} if ("3" .equal {if (j <9) {maplist.put ("value0" + (j + 1), listScore.get (j * isdouble) .get ("show_value"));} else {maplist.put ("value" + (j + 1), listScore.get (j * isdouble) .get ("shrow_value"));}}}} maplist.get ("comté") + ""; if ("340826" .equals (comtéid) || "341822" .equals (comtéid)) {maplist.put ("CityName", maplist.get ("comté") + "");} // String de type d'entreprise Declare_evaluate = maplist.get ("declare_evaluate") + ""; if ("1" .equals (declare_evaluate)) {maplist.put ("declare_evaluate_name", "déclaration");} else {maplist.put ("statut status shstatus = maplist.get ("shstatus") + ""; if ("9" .equals (shstatus)) {maplist.put ("strShStatus", "draft");} else if ("0" .equals (shstatus)) {maplist.put ("StrShstatus", "Enterprise soumission");} else if ("1" .equals (shstatus))) {maplist.put ("strShstatus", "City Review passé");} else if ("2" .equal Passé ");} else if (" 4 ".equals (shstatus)) {maplist.put (" strShStatus "," Revue provinciale a échoué ");} else if (" 5 ".equals (shstatus)) {maplist.put (" strShstatus "," Revue provinciale ");} else if ("6" .equals (shstatus)) {maplist.put ("strShstatus", "retour à la modification d'entreprise");} else if ("7" .equals (shstatus)) {maplist.put ("StrShstatus", "City Review");} else if ("11" .qutifal Déclaration ");} else if (" 12 ".equals (shstatus)) {maplist.put (" strShstatus "," modifier à l'évaluation ");} if (" 1 ".equals (staticflag)) {// Ajouter une liste d'opinion de modification <map <string, objet >> listDetail = declareservice.QueryAuditLog (MainId); if (listDetail.size ()> 0) {String audit_opinion = listDetail.get (0) .get ("audit_opinion") + ""; if (! stringUtils.isempty (Audit_opinion) &&! "null" .equal else {maplist.put ("audit_opinion", "");}} // est-il utilisé pour être changé en chaîne orgname = maplist.get ("orgname") + ""; string pjName = maplist.get ("pjname") + ""; if (stringUtils.isempty (pjname) || "null" .equals (pjname) || pjname.equals (orgname)) {maplist.put ("isGenggming", "no"); maplist.put ("pjname_e", "");} else {mapte. "Oui"); maplist.put ("pjname_e", pjname);} else if ("2" .equals (staticflag)) {}} liste de retour;} Float public Grademaster (HttpSession Session, String MainId, String Orgid (Authinfo) session.getAttribute (constanteUtil.auth_info); String RightType = info.getRightType (); DeclatemAsterService.DeteScoreMain (MainId); Float [] ResultFirst = new float [100]; / ** First Wercer Stored * * / list <map <string, objet >> listDetail = DeclatemAsterService.QueryTaskDetail (MainId); if ("2" .equals (rightType) || "3" .equals (rightType)) {// convertit String en floatFor (int i = 0; i <listDetail.Size (); i ++) {map <string, objectif> map = map = listDetail.get (i); if (stringUtils.isempty (map.get ("Declare_City_Value") + "") || "null" .equals (map.get ("Declare_City_Value") + "")) {resultFirst [i] = 0f;} else {resultFirst [i] = float.parsefloat (map.get ("Declare_City_Value") + "");}}} else {// convertir la chaîne en floatfor (int i = 0; i <listdetail.size (); i ++) {map <string, objet> map = map = listDetail.get (i); if (stringUtils.isempty (map.get ("declare_province_value") + "") || "null" .equals (map.get ("declare_province_value") + "")) {resultFirst [i] = 0f;} else {resultFirst [i] = float.parsefloat (map.get ("Declare_Province_Value") + "");}}} map <String, Object> Enterprise = EnterprisequeryService.getInfobyorgid (orgid) .get (0); // Calculez la valeur selon la formule de calcul de l'index d'évaluation de l'ANHUI Entreprise Technology Center. L'étape suivante consiste à calculer le score Float Ratio1 = 0f; Float Ratio2 = 0f; Float Ratio3 = 0f; Try {ratio1 = float.parsefloat (Enterprise.get ("Ratio1") + ""); Ratio2 = float.parsefloat (Enterprise.get ("ratio2") + ""); ratio3 = float.parsefloat (enterprise.get ("ratio3") + "");} catch (exception e) {} map <string, objet> map = declateController.getValue (resultFirst, ratio1, ratio2, ratio3); float [] resultValue = (float []) map.get ("resultValue"); float Map.get ("ResultsCoreValue"); float [] RUBLICAGECORE = DECLARECONTROLLER.GETSCORE (RUBLATCOREVALUE); FLOTER SCOTETOTAL = 0F; LIST <Map <String, Object >> ListScore = DeclatemAsterService.SquerySCoredic (); for (int i = 0; i <linScore.Size (); i ++) {sweain swelemain = nouveau) scoremain.setMainId (mainid); scoremain.setsCoRename (listScore.get (i) .get ("score_name") + ""); scoremain.setsCoreUnit (listScore.get (i) .get ("score_unit") + ""); scoreMain.SetScoreweight (listScore.get (i) .get ("score_weight") + ""); scoreMain.SetScoreweight (listScore.get (i) .get ("score_weight") + ""); Scoremain dans.setDisorder (listScore.get (i) .get ("dis_order") + ""); scoremain.setShowValue (resultValue [i] + ""); scoremain.setsCoreValue (ResultsCoreValue [i] + ""); ScoreMain.SetScore (ResultsCore [i] + ""); DeclatemAsterService.inSersCoremain (scoremain); Scoretotoal + = ResultCore [i];} retourne scoretotoal;}}Remarque: MyCallable est juste un moyen compliqué de gérer les affaires. Il peut être ignoré et finalement accélérer de 390 secondes à 40 secondes.
Résumer
Ce qui précède est l'intégralité du contenu de cet article sur l'exemple de code de solution de l'exécution et du traitement multi-threads Java trop longtemps. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!