Método de llamadas:
/** * Número de clics/mes (año) Callable */public void anuallyClickCallable () {// get parámetros cadena año = getpara ("año"); // Estadística Conjunto de datos X List <String> xList = new ArrayList <String> (); xlist.add ("enero"); xlist.add ("febrero"); xlist.add ("marzo"); xlist.add ("abril"); xlist.add ("may"); xlist.add ("junio"); xlist.add ("julio"); xlist.add ("julio"); xlist.add ("agosto"); xlist.add ("septiembre"); xlist.add ("octubre"); xlist.add ("noviembre"); xlist.add ("diciembre"); // estadística DataSet Y List <Integer> ylist = new ArrayList <Integer> (); // Recibir Lista de valor del hilo <Future <List <Map <String, Object >>>>>>> FUTURELIST = New ArrayList <Future <List <Map <String, Object >>>> (); // contador int count = 0; // Crear un grupo de subprocesos (decida cuántos hilos iniciar) EjecutorService Pool = Ejecutors.newCachedThreadPool (); // Análisis de registro mensual para (int m = 1; m <= 12; m ++) {// recopilar parámetros de fecha list <string> dataList = new ArrayList <String> (); // string date = ""; // Determinar cuántos días int días = calendarutil.weekformonth (integer.valueof (año), m); // fecha de combinación para (int i = 1; i <= días; i ++) {if (i <= 9) {if (m <= 9) {date = año + "-0" + m + "-0" + i; } else {date = año + "-" + m + "-0" + i; }} else {if (m <= 9) {date = año + "-0" + m + "-" + i; } else {date = año + "-" + m + "-" + i; }} dataList.Add (fecha); } // Iniciar futuro <list <map <string, object >>> futuro = Pool.subMit (nuevo readLogFileCallableByyear (DataList)); futureList.add (futuro); } // Cierre el grupo de piscina de hilo.shutdown (); // Reciba el conjunto de resultados para (Future <List <Map <String, Object >>>> Future: FutureList) {try {// Recibe la lista de parámetros <map <string, object >>> list = futuro.get (1, TimeUnit.SeConds); // Establezca el parámetro para (int p = 0; p <list.size (); p ++) {count+= (int) list.get (p) .get ("clickCount"); if (list.get (p) .get ("mes"). Equals ("01")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("02")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("03")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("03")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("03")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("04")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("05")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("06")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("06")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("06")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("07")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("08")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("09")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("09")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("09")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("10")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("11")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mes"). Equals ("12")) {ylist.add ((integer) list.get (p) .get ("clickCount")); }}}} Catch (Exception e) {E.PrintStackTrace (); }} setattr ("totalCount", count); setattr ("x", xlist); setattr ("y", ylist); renderjson (); }Método de lectura múltiple:
paquete com.ninemax.util.loganalysis; import java.io.bufferedReader; import java.io.file; import java.io.fileInputStream; import java.io.ioexception; import java.io.inputstreamreader; import java.util.araylist; java.util.map; import java.util.concurrent.callable; import com.ninemax.util.loganalysis.tool.constantutil;/** * valor de retorno multithreaded * * @author oscuro * */public class readLogFilEcallableByear implementa Callable <List <list <String, Object>>> {/////Contax Class. // Return Result Set Public List <Map <String, Object >>> list = new ArrayList <map <string, object >> (); Public ReadLogFilecallableByYear (List <String> ClickDate) {this.ClickDate = ClickDate; } @Override Public List <map <string, object >> call () lanza excepción {// Recibe parámetros MAP <String, Object> MAP = new HashMap <String, Object> (); // Use FileInputStream para leer la información del archivo FileInputStream Fis = null; // use InputStreamReader para transcodificar InputStreamReader Reader = null; // Use BufferedReader para Buffer BufferedReader bufReader = null; // use StringBuffer para recibir contenido del contenido del archivo StringBuffer buf = new StringBuffer (); // clics/mes int mesClick = 0; for (int i = 0; i <clickdate.size (); i ++) {// Obtener archivo Archivo ClickLogFile = new File (constantUtil.logLocation, "Artículo.Click."+ ClickDate.get (i)+ ".txt"); // Determinar si el archivo existe si (! ClicklogFile.exists () || clicklogFile.isDirectory ()) {system.err.println (clickDate.get (i) + "El archivo no existe ..."); map.put ("mes", clickdate.get (i) .substring (5, 7)); map.put ("ClickCount", 0); list.add (mapa); lista de devolución; } else {try {// nodo stream fis = new FileInputStream (ClickLogFile); // Convertir Stream Reader = new InputStreamReader (FIS, "UTF-8"); // Processing Stream bufReader = new BufferedReader (lector); // contador int count = 0; // Leer String Line = ""; // Leer archivo while ((line = bufReader.Readline ())! = NULL) {// Count Count ++; // Recibe datos if (! Line.equals (null) &&! Line.equals ("")) {buf.append (line + "/n"); }} if (count == 0) {count = 0; } else {Count = Count - 1; } mesClick += Count; } catch (Exception e) {E.PrintStackTrace (); } Finalmente {// Close Stream Try {bufReader.close (); lector.close (); fis.close (); } catch (ioException e) {E.PrintStackTrace (); }}}} // Results set map.put ("mes", clickdate.get (0) .substring (5, 7)); if (mesclick == 0) {map.put ("clickCount", 0); } else {map.put ("clickCount", mesclick); } list.add (mapa); lista de devolución; }}Compartiré con ustedes un ejemplo de un internautor, que también es muy bueno
import java.util.concurrent.callable; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.future;/*** Interfaces llamables y futuras* Las llamables son interfaces similares a las corridas. Las clases que implementan interfaz y clases llamables que implementan Runnable son tareas que pueden ser ejecutadas por otros hilos. * Callable and Runnable tiene varias diferencias: * (1) El método especificado por llamable es llamar (), mientras que el método especificado por Runnable es run (). * (2) La tarea llamable puede devolver el valor después de que se ejecute, mientras que la tarea ejecutable no puede devolver el valor. * (3) El método de llamada () puede lanzar excepciones, mientras que el método run () no puede lanzar excepciones. * (4) Ejecute la tarea llamable y puede obtener un objeto futuro. El futuro representa el resultado del cálculo asincrónico. * Proporciona un método para verificar si el cálculo se completa, para esperar a que se complete el cálculo y recuperar los resultados del cálculo. * A través del objeto futuro, puede comprender el estado de ejecución de la tarea, cancelar la ejecución de la tarea y también obtener los resultados de la ejecución de la tarea. */public class CallableAndFuture {/***Personalice una clase de tareas para implementar la interfaz llamable*/public static Class myCallableClass implementa Callable {// Flag Bit intent intent = 0; public myCallableClass (int flag) {this.flag = flag;} public String Call () que se excita {if (this.flag == 0) {// el valor de la flager; 0 ";} if (this.flag == 1) {// Si el valor de la bandera es 1, haga un bucle infinito try {while (true) {system.out.println (" bucleing ... "); thread.sleep (2000);}} catch (interrompedException e) {system.println (" interrumpido);} retorno "falso";};} 1, entonces se lanza una excepción. nueva excepción ("valor de bandera incorrecta!");}}} public static void main (string [] args) {// Definir 3 tareas de tipos llamables myCallableClass tarea1 = new myCallableClass (0); myCallableClass Task2 = new MyCallApLass (1); myCallAcLassSssS EjecutorService es = Ejecutors.NewFixedThreadPool (3); intente {// Envíe y ejecute la tarea. Se devuelve un objeto futuro cuando se inicia la tarea. // Si desea obtener el resultado de la ejecución de la tarea o una excepción, puede operar el objeto futuro. Future Future1 = es.submit (tarea1); // Obtenga el resultado de la primera tarea. Si se llama al método GET, el hilo actual esperará a que la tarea se ejecute antes de ejecutar System.out.println ("Tarea1:" + Future1.get ()); Future Future2 = es.submit (Tarea2); // Espere 5 segundos antes de detener la segunda tarea. Porque la segunda tarea es un bucle infinito hilt.sleep (5000); system.out.println ("tarea2 cancelar:" + futuro2.cancel (true)); // Obtenga la salida de la tercera tarea, porque la ejecución de la tercera tarea causará una excepción // la siguiente declaración hará que una excepción futura 3 = es.s.submit (task3); system.out.Println ("Tarea3:" Task3: "") (Exception e) {System.out.println (e.ToString ());} // Detener el servicio de ejecución de tareas es.shutdownnow ();}}Lo anterior es todo el contenido de este artículo. Si lo necesita, consultelo.