Método de chamada:
/** * Número de cliques/mês (ano) Callable */public void anulyClickCallable () {// Get Parameters String ano = getPara ("ano"); // Conjunto de dados de estatísticas X LIST <String> xlist = new ArrayList <String> (); xlist.add ("janeiro"); xlist.add ("fevereiro"); xlist.add ("março"); xlist.add ("abril"); xlist.add ("May"); xlist.add ("junho"); xlist.add ("julho"); xlist.add ("julho"); xlist.add ("agosto"); xlist.add ("setembro"); xlist.add ("outubro"); xlist.add ("novembro"); xlist.add ("dezembro"); // DataSet Statistics. // Receba Lista de Valor do Tópico <Future <List <Map <String, Object >>>>>>> FutureList = new ArrayList <Future <List <Map <String, Object >>> (); // Counter int count = 0; // Crie um pool de threads (decida quantos threads iniciar) ExecutService pool = executores.newcachedthreadpool (); // Análise mensal de log para (int m = 1; m <= 12; m ++) {// Lista de parâmetros de data de coleta <String> DATELIST = new ArrayList <String> (); // string date = ""; // determinar quantos dias int dias = calendarutil.weekformontnth (Integer.valueof (ano), m); // data de combinação para (int i = 1; i <= dias; i ++) {if (i <= 9) {if (m <= 9) {date = ano + "-0" + m + "-0" + i; } else {date = ano + "-" + m + "-0" + i; }} else {if (m <= 9) {date = ano + "-0" + m + "-" + i; } else {date = ano + "-" + m + "-" + i; }} datelist.add (data); } // Inicie o futuro <List <map <string, object >>> futuro = pool.submit (novo readLogFileCallableByYear (Datelist)); futureList.add (futuro); } // Fechar o pool de threads pool.shutdown (); // Receba o conjunto de resultados para (Future <List <map <string, object >>>> futuro: futureList) {tente {// recebe a lista de parâmetros <map <string, object >>> list = futuro.get (1, timeUnit.Seconds); // Defina o parâmetro para (int p = 0; p <list.size (); p ++) {count+= (int) list.get (p) .get ("clickCount"); if (list.get (p) .get ("mês"). igual ("01")) {ylist.add ((integer) list.get (p) .get ("clickcount")); } else if (list.get (p) .get ("mês"). Equals ("02")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("03")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("03")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("03")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("04")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("05")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("06")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("06")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("06")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("07")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("08")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("09")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("09")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("09")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("10")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("11")) {ylist.add ((integer) list.get (p) .get ("clickCount")); } else if (list.get (p) .get ("mês"). Equals ("12")) {ylist.add ((integer) list.get (p) .get ("clickCount")); }}}} catch (Exceção e) {e.printStackTrace (); }} setAtTtr ("TotalCount", contagem); setattr ("x", xlist); setattr ("y", ylist); renderjson (); }Método multithread:
pacote com.ninemax.util.loganalysis; importar java.io.bufferedReader; importar java.io.file; importar java.io.fileInputStream; importar java.io.ioexception; importar java.io.inputreamreader; import.util.ArrayList; java.util.map; importar java.util.Concurrent.Callable; importar com.ninemax.util.loganalysis.tool.constantutil;/** * Valor de retorno multithread * * @author escuro * */public classe readLogFilECLABLEYEAREDYearTable <MapLable <MapLABE <TRAYBELTER, <TRAYBETD), que não é um dos implementos * * * * * * * * * * * * * * * * * * ** ** ** ** **) // Retorno Resultado Conjunto Lista pública <map <string, object >>> list = new ArrayList <map <string, object >> (); public ReadLogFileCallableByYear (List <String> clickDate) {this.ClickDate = clickDate; } @Override Public List <map <string, object >> Call () lança Exceção {// Map parâmetros de recebimento <string, object> map = new hashmap <string, object> (); // Use FileInputStream para ler informações do arquivo FileInputStream fis = null; // Use o InputStreamReader para transcodificar InputStreamReader Reader = NULL; // Use BufferReader para buffer BufferReader bufreader = null; // Use StringBuffer para receber o contêiner de conteúdo do arquivo StringBuffer buf = new StringBuffer (); // cliques/mês int mês click = 0; para (int i = 0; i <clickdate.size (); i ++) {// Obtenha arquivo de arquivo clicklogfile = new File (constantutil.LogLocation, "article.Click."+ clickdate.get (i)+ ".txt"); // Determine se o arquivo existe se (! Clicklogfile.exists () || clicklogfile.isdirectory ()) {System.err.println (clickdate.get (i) + "o arquivo não existe ..."); map.put ("mês", clickdate.get (i) .substring (5, 7)); map.put ("ClickCount", 0); list.add (mapa); lista de retorno; } else {try {// fluxo de nó fis = new FileInputStream (clicklogfile); // Converter Stream Reader = new InputStreamReader (FIS, "UTF-8"); // Bufreader de fluxo de processamento = new BufferredReader (leitor); // Counter int count = 0; // leia string line = ""; // Leia o arquivo while ((line = bufreader.readline ())! = Null) {// contagem de contagem ++; // Receba dados se (! Line.equals (null) &&! Line.equals ("")) {buf.append (line + "/n"); }} if (count == 0) {count = 0; } else {count = count - 1; } mês click += count; } catch (Exceção e) {e.printStackTrace (); } finalmente {// FORNECIMENTO TRANHO {BUFREADER.CLOSIDE (); leitor.close (); fis.close (); } catch (ioexception e) {e.printStackTrace (); }}}} // Resultado Definir map.put ("mês", clickdate.get (0) .substring (5, 7)); if (mensclick == 0) {map.put ("clickCount", 0); } else {map.put ("clickcount", mensal); } list.add (mapa); lista de retorno; }}Vou compartilhar com você um exemplo de internautas, o que também é muito bom
importar java.util.Concurrent.Callable; importar java.util.concurrent.executorService; importar java.util.concurrent.executores; importar java.util.concurrent.future;/** ** ** e interfaces futuros* chamadas são interfaces similares. As classes que implementam interface chamada e classes que implementam executáveis são tarefas que podem ser executadas por outros threads. * Callable e Runnable têm várias diferenças: * (1) O método especificado pelo chamável é chamado (), enquanto o método especificado pelo runnable é executado (). * (2) A tarefa chamada pode retornar o valor após a execução, enquanto a tarefa executável não pode retornar o valor. * (3) O método Call () pode lançar exceções, enquanto o método run () não pode lançar exceções. * (4) Execute a tarefa chamada e você poderá obter um objeto futuro. Futuro representa o resultado de cálculo assíncrono. * Ele fornece um método para verificar se o cálculo é concluído, para aguardar a conclusão do cálculo e recuperar os resultados do cálculo. * Através do objeto futuro, você pode entender o status de execução da tarefa, cancelar a execução da tarefa e também obter os resultados da execução da tarefa. */public class CallableAndFuture {/***Personalize uma classe de tarefa para implementar a interface chamada*/public static class MyCallableClass implementa chamadas {// sinalizador private int flag = 0; public MyCallabLAlClass (int flag) {this.flag = flag;} public string ()/the the the (0.ft (Int Flag) {this.flag = flag;} public string ()/throws {if (se 0 ";} if (this.flag == 1) {// Se o valor do sinalizador for 1, faça um loop infinito, tente {while (true) {System.out.println (" looping ... "); thread.sleep (2000);}} catch (interruedException e) {system.out.printlnnnnnnnN ("}} Catch); Não 0 ou 1, então uma exceção é lançada. nova exceção ("Valor do sinalizador ruim!");}}} public static void main (string [] args) {// define 3 tipos de chamadas Tarefas myCallableClass Task1 = new MyCallabLAlClass (0); MyCallabLAlCLASS Task2 = new MyCallablllSl (1); MyCallabLAclask3; ExecutorService ES = executores.newfixedThreadpool (3); tente {// envie e execute a tarefa. Um objeto futuro é retornado quando a tarefa é iniciada. // Se você deseja obter o resultado da execução da tarefa ou uma exceção, poderá operar o objeto futuro. Futuro futuro1 = es.submit (tarefa1); // obtém o resultado da primeira tarefa. Se o método GET for chamado, o thread atual aguardará a execução da tarefa antes de executar o System.out.println ("Task1:" + FUTURO1.GET ()); Future Future2 = Es.Submit (Task2); // Aguarde 5 segundos antes de interromper a segunda tarefa. Como a segunda tarefa é um fio de loop infinito.Sleep (5000); System.out.println ("Task2 Cancelar:" + futuro2.Cancel (true)); // Obtenha a saída da terceira tarefa, porque a execução da terceira tarefa causará uma exceção. futuro3.get ());} catch (Exceção e) {System.out.println (e.toString ());} // Pare o serviço de execução de tarefas es.shutdownNow ();}}O acima é o conteúdo inteiro deste artigo. Se você precisar, consulte -o.