Metode Panggilan:
/** * Jumlah klik/bulan (tahun) Callable */public void tahunan per tahun () {// Dapatkan parameter string tahun = getPara ("tahun"); // Statistik Set Data X Daftar <String> xList = ArrayList baru <string> (); xlist.add ("Januari"); xlist.add ("Februari"); xlist.add ("March"); xlist.add ("April"); xlist.add ("may"); xlist.add ("June"); xlist.add ("Juli"); xlist.add ("Juli"); xlist.add ("Agustus"); xlist.add ("September"); xlist.add ("Oktober"); xlist.add ("November"); xlist.add ("Desember"); // Dataset Statistik Y Daftar <Integer> ylist = ArrayList baru <Integer> (); // Terima Daftar Nilai Thread <Masa Depan <Daftar <MAP <MAP <String, Object >>>>>>> futureList = ArrayList baru <Future <Daftar <Daftar <MAP <String, Object >>> (); // Counter int count = 0; // Buat kumpulan utas (putuskan berapa banyak utas yang akan dimulai) ExecutorService pool = executors.newcachedThreadPool (); // Analisis log bulanan untuk (int m = 1; m <= 12; m ++) {// Daftar parameter tanggal mengumpulkan <string> Datelist = ArrayList baru <string> (); // date string = ""; // tentukan berapa hari int hari = calendarutil.weekformonth (integer.valueof (tahun), m); // Tanggal kombinasi untuk (int i = 1; i <= days; i ++) {if (i <= 9) {if (m <= 9) {date = tahun + "-0" + m + "-0" + i; } else {date = tahun + "-" + m + "-0" + i; }} else {if (m <= 9) {date = tahun + "-0" + m + "-" + i; } else {date = tahun + "-" + m + "-" + i; }} datelist.add (tanggal); } // Mulai Future <List <Map <String, Object >>> Future = pool.submit (baru readlogfileCallableByYear (Datelist)); futurelist.add (masa depan); } // Tutup thread pool pool.shutdown (); // menerima hasil yang ditetapkan untuk (Future <List <map <string, Object >>>> Future: FutureList) {coba {// Terima daftar parameter <peta <string, objek >>> Daftar = Future.get (1, TimeUnit.Seconds); // Atur parameter untuk (int p = 0; p <list.size (); p ++) {count+= (int) list.get (p) .get ("clickcount"); if (list.get (p) .get ("bulan"). 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 (); }Metode multithreaded:
Paket com.ninemax.util.loganalysis; impor java.io.bufferedreader; impor java.io.file; impor java.io.fileinputStream; Java.io.ioException; impor Java.inputStreamReader; impor java.util.raylist; java.util.list; impor java.util.map; impor java.util.concurrent.callable; import com.ninemax.util.loganalysis.tool.constantutil;/** * Nilai pengembalian Multithready * @Author Darker */Kelas Publik Readlogfilable {listyby {listyyby <listy <listy <listy */classe readlogfilable {listyby <listy <listy <listy <list list */public class readlogfileby {listyby <listy <listy <listy <list lister */public class readlogfilEcall callerby {listyby <listy <listy <listy <list lister */public class readlogfileBLYABLEBLY Array Private List <String> klik; // Return Hasil Setel Daftar Publik <peta <String, Object >>> Daftar = ArrayList baru <peta <String, Object >> (); publik readlogfileCallableByYear (daftar <string> klik) {this.clickDate = clickDate; } @Override Daftar publik <peta <string, objek >> panggilan () melempar pengecualian {// menerima parameter peta <string, objek> peta = hashmap baru <string, objek> (); // Gunakan FileInputStream untuk membaca Informasi File FileInputStream fis = null; // Gunakan inputStreamReader untuk transcode inputStreamReader reader = null; // Gunakan BufferedReader untuk buffer bufferedReader bufreader = null; // Gunakan StringBuffer untuk menerima konten konten file StringBuffer buf = new StringBuffer (); // klik/bulan int monthClick = 0; untuk (int i = 0; i <clickDate.size (); i ++) {// Dapatkan file file clickLogFile = file baru (constantutil.loglocation, "artikel.click."+ clickDate.get (i)+ ".txt"); // Tentukan apakah ada file jika (! Clicklogfile.exists () || clicklogfile.isDirectory ()) {System.err.println (clickDate.get (i) + "File tidak ada ..."); peta.put ("bulan", clickDate.get (i) .substring (5, 7)); Map.put ("ClickCount", 0); list.add (peta); daftar pengembalian; } else {coba {// node stream fis = new fileInputStream (clicklogFile); // Konversi Stream Reader = InputStreamReader baru (FIS, "UTF-8"); // memproses aliran bufreader = BufferedReader baru (pembaca); // Counter int count = 0; // Baca string line = ""; // Baca file while ((line = bufreader.readline ())! = Null) {// count count ++; // menerima data if (! Line.equals (null) &&! Line.equals ("")) {buf.applepend (line + "/n"); }} if (count == 0) {count = 0; } else {count = count - 1; } monthClick += count; } catch (Exception e) {E.PrintStackTrace (); } akhirnya {// tutup aliran coba {bufreader.close (); reader.close (); fis.close (); } catch (ioException e) {e.printstacktrace (); }}}} // Hasil atur peta.put ("bulan", clickDate.get (0) .substring (5, 7)); if (monthClick == 0) {map.put ("clickcount", 0); } else {map.put ("clickcount", monthClick); } list.add (peta); daftar pengembalian; }}Saya akan berbagi dengan Anda contoh netizen, yang juga sangat bagus
impor java.util.concurrent.callable; impor java.util.concurrent.executorservice; impor java.util.concurrent.executors; import java.util.concurrent.future;/*** antarmuka yang dapat dipanggil dan masa depan* Callable antarmuka yang mirip dengan runnable. Kelas yang menerapkan antarmuka yang dapat dipanggil dan kelas -kelas yang menerapkan Runnable adalah tugas yang dapat dieksekusi oleh utas lain. * Callable dan Runnable memiliki beberapa perbedaan: * (1) Metode yang ditentukan oleh Callable adalah call (), sedangkan metode yang ditentukan oleh Runnable adalah run (). * (2) Tugas yang dapat dipanggil dapat mengembalikan nilai setelah dieksekusi, sedangkan tugas yang dapat dijalankan tidak dapat mengembalikan nilainya. * (3) Metode panggilan () dapat melempar pengecualian, sedangkan metode run () tidak dapat melempar pengecualian. * (4) Jalankan tugas yang dapat dipanggil dan Anda bisa mendapatkan objek di masa depan. Masa depan merupakan hasil dari perhitungan asinkron. * Ini menyediakan metode untuk memeriksa apakah perhitungan selesai, untuk menunggu perhitungan selesai, dan untuk mengambil hasil perhitungan. * Melalui objek mendatang, Anda dapat memahami status eksekusi tugas, membatalkan eksekusi tugas, dan juga mendapatkan hasil eksekusi tugas. */kelas publik callableAndfuture {/***Sesuaikan kelas tugas untuk mengimplementasikan antarmuka yang dapat dipanggil*/kelas statis public mycallableClass mengimplementasikan flag {// flag private = 0; public mycallableClass (this.flag (this.flag = flag;} public string call () lemparan pengecualian {if) {this.flag =} public call public () lemparan pengecualian {if) {this. = 0 ";} if (this.flag == 1) {// Jika nilai bendera adalah 1, buat loop tak terbatas coba {while (true) {System.out.println (" looping ... "); thread.sleep (2000);}} catch (interruptEcception e) {System.out.seprint (2000);}} fale" fale "; bukan 0 atau 1, maka pengecualian dilemparkan. new Exception("Bad flag value!");}}} public static void main(String[] args) {// Define 3 Callable types tasks MyCallableClass task1 = new MyCallableClass(0);MyCallableClass task2 = new MyCallableClass(1);MyCallableClass task3 = new MyCallableClass(2);// Create a service that executes Tugas ExecutorService ES = Executors.newfixedThreadPool (3); coba {// Kirim dan jalankan tugas. Objek masa depan dikembalikan saat tugas dimulai. // Jika Anda ingin mendapatkan hasil eksekusi tugas atau pengecualian, Anda dapat mengoperasikan objek masa depan. Future Future1 = Es.submit (Task1); // Dapatkan hasil dari tugas pertama. Jika metode GET dipanggil, utas saat ini akan menunggu tugas dieksekusi sebelum mengeksekusi System.out.println ("Tugas1:" + Future1.get ()); Future Future2 = Es.submit (Task2); // tunggu selama 5 detik sebelum menghentikan tugas kedua. Karena tugas kedua adalah loop thread yang tak terbatas. found founds.get ());} catch (Exception e) {System.out.println (e.toString ());} // Hentikan layanan eksekusi tugas es.shutdownnow ();}}Di atas adalah seluruh konten artikel ini. Jika Anda membutuhkannya, silakan merujuknya.