Метод вызова:
/** * Количество кликов/месяц (год) Callable */public void yanlyClickCallable () {// Получить параметры String Год = getPara ("Год"); // Статистический набор данных x List <string> xlist = new ArrayList <string> (); xlist.add ("январь"); xlist.add ("февраль"); xlist.add ("март"); xlist.add ("апрель"); xlist.add ("May"); xlist.add ("июнь"); xlist.add ("июль"); xlist.add ("июль"); xlist.add ("Август"); xlist.add ("сентябрь"); xlist.add ("Октябрь"); xlist.add ("ноябрь"); xlist.add ("декабрь"); // Статистические наборы данных y List <Integer> ylist = new ArrayList <Integer> (); // Получение списка значений потока <future <List <Map <String, Object >>>>>> futureList = new ArrayList <Future <List <Map <String, Object >>>> (); // счетчик int count = 0; // Создать пул потоков (решить, сколько потоков запустить) ExecutorService Pool = experators.newcachedThreadpool (); // Ежемесячный анализ журнала для (int m = 1; m <= 12; M ++) {// Собрание списка параметров даты <string> datelist = new ArrayList <string> (); // строка date = ""; // определить, сколько дней int Days = calendarutil.weekformonth (Integer.valueof (Год), м); // Дата комбинации для (int i = 1; i <= days; i ++) {if (i <= 9) {if (m <= 9) {date = year + "-0" + m + "-0" + i; } else {date = Год + "-" + M + "-0" + I; }} else {if (m <= 9) {date = Год + "-0" + M + "-" + i; } else {date = Год + "-" + M + "-" + i; }} datelist.add (date); } // запустить будущее <list <map <string, object >>> future = pool.submit (new ReadlogfileCallablebyyear (datelist)); FutureList.Add (будущее); } // Закройте пул пула потоков.shutdown (); // Получить набор результатов для (Future <List <Map <String, Object >>>> Future: FutureList) {try {// получение списка параметров <map <string, object >>> list = future.get (1, timeUnit.seconds); // Установить параметр для (int p = 0; p <list.size (); p ++) {count+= (int) list.get (p) .get ("clickCount"); if (list.get (p) .get ("month"). equals ("01")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("02")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("03")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("03")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("03")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("04")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("05")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("06")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("06")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("06")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("07")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("08")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("09")) {ylist.add (((Integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("09")) {ylist.add (((Integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("09")) {ylist.add (((Integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("10")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). equals ("11")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("month"). 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 (); }Метод многопоточности:
пакет com.ninemax.util.loganalysis; import java.io.bufferedReader; импорт java.io.file; импорт java.io.fileinputstream; импорт java.io.ioexception; импорт java.io.InptreamReader; импорт java.Util.Arraylist; java.ut.hashMap; java.util.Map;import java.util.concurrent.Callable;import com.ninemax.util.loganalysis.tool.ConstantUtil;/** * Multithreaded return value* * @author Darker * */public class ReadLogFileCallableByYear implements Callable<List<Map<String, Object>>> { // Date array private List<String> clickDate; // вернуть результат Установка публичного списка <map <string, object >>> list = new ArrayList <map <string, object >> (); public readlogfileCallableByyeear (list <string> clickdate) {this.clickDate = clickDate; } @Override public list <map <string, object >> call () throws Exception {// получение параметров Map <String, Object> Map = new HashMap <String, Object> (); // Использование FileInputStream для чтения информации о файле FileInputStream fis = null; // Использование inputStreamReader для транскода inputStreamReader Reader = null; // Использовать BufferedReader для буферизации BufferedReader bufreader = null; // Использование StringBuffer для получения контейнера содержимого файла stringBuffer buf = new StringBuffer (); // клики/месяц int monthclick = 0; для (int i = 0; i <clickdate.size (); i ++) {// Получить файл файла clicklogfile = new file (constantutil.loglocation "article.click."+ clickdate.get (i)+ ".txt"); // определить, существует ли файл if (! Clicklogfile.exists () || clicklogfile.isdirectory ()) {System.err.println (clickdate.get (i) + «Файл не существует ...»); map.put ("месяц", clickdate.get (i) .substring (5, 7)); map.put ("clickCount", 0); list.add (map); вернуть список; } else {try {// node Stream fis = new FileInputStream (clicklogfile); // конвертировать stream Reader = new InputStreamReader (FIS, "UTF-8"); // Обработка потока Bufreader = new BufferedReader (Reader); // счетчик int count = 0; // Читать строки line = ""; // Читать файл while (((line = bufreader.readline ())! = Null) {// count count ++; // получение данных if (! Line.equals (null) &&! Line.equals ("")) {buf.append (line + "/n"); }} if (count == 0) {count = 0; } else {count = count - 1; } monthclick += count; } catch (Exception e) {e.printstackTrace (); } наконец {// Close Stream try {bufreader.close (); reader.close (); fis.close (); } catch (ioException e) {e.printstackTrace (); }}}} // SET RUSET SET MAP.PUT ("Месяц", clickDate.get (0) .SubString (5, 7)); if (monthclick == 0) {map.put ("clickCount", 0); } else {map.put ("clickCount", Monthclick); } list.add (map); вернуть список; }}Я поделюсь с вами примером сети, который также очень хорош
import java.util.concurrent.callable; import java.util.concurrent.executorservice; import java.util.concurrent.executors; импорт java.util.concurrent.future;/*** Callable и будущие интерфейсы* Callace -Calles - это интерфейсы, аналогичные запускаемым. Классы, которые реализуют Callable Interface и классы, которые реализуют запускаемые, являются задачами, которые могут быть выполнены другими потоками. * Callable и Runnable имеет несколько различий: * (1) Метод, указанный Callable, IS Call (), в то время как метод, указанный с помощью Runnable, run (). * (2) Задача Callable может вернуть значение после его выполнения, в то время как выполняемая задача не может вернуть значение. * (3) Метод Call () может бросить исключения, в то время как метод run () не может бросить исключения. * (4) Запустите задачу, и вы можете получить будущий объект. Будущее представляет собой результат асинхронного расчета. * Он предоставляет метод, чтобы проверить, заполнен ли расчет, чтобы дождаться завершения расчета, и для получения результатов расчета. * Через будущий объект вы можете понять статус выполнения задачи, отменить выполнение задачи, а также получить результаты выполнения задачи. */public Class callableAndfuture {/***Настроить класс задания, чтобы реализовать разбираемый интерфейс*/public Static Class MyCallableClass реализует Callable {// flag bit private int flag = 0; public mycallableclass (int flag) {this.flag = flag;} public String Call () Throws exception {if this.flag == 0) {//flag;} sturning string exmance {if.flag == 0) {//flag; if at altga is afte restry {if this.flag == 0). 0 ";} if (this.flag == 1) {// Если значение флага составляет 1, сделайте бесконечный цикл Try {while (true) {System.out.println (" Ципл ... "); Thread.sleep (2000);}} catch (InterruptException e) {System.out.println (" revrupted "); 0 или 1, затем брошено исключение. Новое исключение ("Значение плохого флага!");}}} public static void main (string [] args) {// define 3 задач Callable Types myCallableClass task1 = new MyCallableClass (0); myCallableClass task2 = new MyCallableclass (1); MyCallablass task3 = new MyCallAblass (2); = Executors.newfixedthreadpool (3); try {// отправить и выполнить задачу. Будущий объект возвращается, когда задача начинается. // Если вы хотите получить результат выполнения задачи или исключения, вы можете управлять будущим объектом. Future Future1 = es.submit (task1); // Получить результат первой задачи. Если метод GET вызван, текущий поток будет ждать выполнения задачи перед выполнением System.out.println ("task1:" + future1.get ()); Future2 = es.submit (task2); // ждать 5 секунд, прежде чем остановить вторую задачу. Поскольку вторая задача представляет собой бесконечный цикл Thread.sleep (5000); System.out.println ("Task2 Cancel:" + Future2.cancel (true)); // Получение вывода третьей задачи, потому что выполнение третьей задачи приведет к исключению //, поэтому следующее заявление вызовет исключение из Future3 = Es.submit (Task3); (Exception e) {System.out.println (e.toString ());} // Остановить службу выполнения задачи Es.ShutDownNow ();}}Вышеуказанное - все содержание этой статьи. Если вам это нужно, пожалуйста, обратитесь к этому.