วิธีการโทร:
/** * จำนวนการคลิก/เดือน (ปี) callable */โมฆะสาธารณะเป็นรายปี callickalable () {// รับพารามิเตอร์สตริงปี = getPara ("ปี"); // สถิติชุดข้อมูล x รายการ <String> xList = new ArrayList <String> (); xlist.add ("มกราคม"); xlist.add ("กุมภาพันธ์"); xlist.add ("มีนาคม"); xlist.add ("เมษายน"); xlist.add ("พฤษภาคม"); xlist.add ("มิถุนายน"); xlist.add ("กรกฎาคม"); xlist.add ("กรกฎาคม"); xlist.add ("สิงหาคม"); xlist.add ("กันยายน"); xlist.add ("ตุลาคม"); xlist.add ("พฤศจิกายน"); xlist.add ("ธันวาคม"); // ชุดข้อมูลสถิติ y รายการ <จำนวนเต็ม> ylist = new ArrayList <integer> (); // รับรายการค่าเธรด <Future <list <map <string, Object >>>>>>> futureList = arrayList ใหม่ <Future <list <map <String, Object >>>> (); // นับ int count = 0; // สร้างพูลเธรด (ตัดสินใจว่าจะเริ่มเธรดจำนวนเท่าใด) ExecutORService Pool = Executors.newCachedThreadPool (); // การวิเคราะห์บันทึกรายเดือนสำหรับ (int m = 1; m <= 12; m ++) {// รวบรวมรายการพารามิเตอร์วันที่ <String> datelist = new ArrayList <String> (); // สตริงวันที่ = ""; // กำหนดจำนวนวันที่ int = calendarutil.weekformonth (integer.valueof (ปี), m); // วันที่รวมกันสำหรับ (int i = 1; i <= วัน; i ++) {ถ้า (i <= 9) {ถ้า (m <= 9) {วันที่ = ปี + "-0" + m + "-0" + i; } else {date = year + "-" + m + "-0" + i; }} else {ถ้า (m <= 9) {วันที่ = ปี + "-0" + m + "-" + i; } else {วันที่ = ปี + "-" + m + "-" + i; }} datelist.add (วันที่); } // เริ่มต้นอนาคต <list <map <string, object >>> future = pool.submit (ใหม่ readlogFileCallableByear (Datelist)); FutureList.add (อนาคต); } // ปิดพูลพูลเธรด shutdown (); // รับชุดผลลัพธ์สำหรับ (Future <list <map <string, Object >>>> อนาคต: FutureList) {ลอง {// รับรายการพารามิเตอร์ <แผนที่ <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 ("เดือน"). เท่ากับ ("01")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("02")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("03")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("03")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("03")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("04")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("05")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("06")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("06")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("06")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("07")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("08")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("09")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("09")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("09")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("10")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("11")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); } อื่นถ้า (list.get (p) .get ("เดือน"). เท่ากับ ("12")) {ylist.add ((จำนวนเต็ม) list.get.get (p) .get ("clickCount")); }}}} catch (Exception E) {E.printStackTrace (); }} setAttr ("totalCount" นับ); setattr ("x", xlist); setattr ("y", ylist); renderjson (); -วิธีการแบบมัลติเธรด:
แพ็คเกจ com.ninemax.util.loganalysis; นำเข้า java.io.bufferedreader; นำเข้า java.io.file; นำเข้า java.io.fileinputstream; นำเข้า java.io.ioexception; นำเข้า java.io.inputstreamreader; java.util.map; นำเข้า java.util.concurrent.callable; นำเข้า com.ninemax.util.loganalysis.tool.constantutil;/** * multithreaded ค่าส่งคืน * * @author darker * */คลาสสาธารณะ // ส่งคืนผลลัพธ์ที่ตั้งค่ารายการสาธารณะ <แผนที่ <สตริงวัตถุ >>> list = arrayList ใหม่ <แผนที่ <สตริงวัตถุ >> (); Public ReadLogFileCallableByYear (รายการ <String> ClickDate) {this.ClickDate = ClickDate; } @Override รายการสาธารณะ <แผนที่ <string, object >> call () พ่นข้อยกเว้น {// รับพารามิเตอร์แผนที่ <สตริง, Object> map = new hashmap <string, object> (); // ใช้ FileInputStream เพื่ออ่านข้อมูลไฟล์ FileInputStream FIS = NULL; // ใช้ inputStreamReader เพื่อ transCode inputStreamReader reader = null; // ใช้ bufferedReader เพื่อบัฟเฟอร์ bufferedreader bufreader = null; // ใช้ StringBuffer เพื่อรับเนื้อหาไฟล์คอนเทนเนอร์ StringBuffer BUF = ใหม่ StringBuffer (); // Clicks/Month int monthclick = 0; สำหรับ (int i = 0; i <clickdate.size (); i ++) {// รับไฟล์ไฟล์ clicklogfile = ไฟล์ใหม่ (ConstantUt.LogLocation, "บทความ click."+ clickdate.get (i)+ ".txt"); // ตรวจสอบว่าไฟล์มีอยู่หรือไม่ถ้า (! clicklogfile.exists () || clicklogfile.isdirectory ()) {system.err.println (clickdate.get (i) + "ไฟล์ไม่มีอยู่ ... "); map.put ("เดือน", clickdate.get (i) .substring (5, 7)); map.put ("clickCount", 0); list.add (แผนที่); รายการคืน; } else {ลอง {// node stream fis = ใหม่ fileInputStream (clicklogfile); // แปลง stream reader = new InputStreamReader (FIS, "UTF-8"); // การประมวลผลสตรีม bufreader = ใหม่ bufferedReader (ตัวอ่าน); // นับ int count = 0; // อ่านสตริงบรรทัด = ""; // อ่านไฟล์ในขณะที่ ((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 += นับ; } catch (exception e) {e.printstacktrace (); } ในที่สุด {// ปิดสตรีมลอง {bufreader.close (); reader.close (); fis.close (); } catch (ioexception e) {e.printstacktrace (); }}}} // ชุดผลลัพธ์ map.put ("เดือน", clickdate.get (0) .substring (5, 7)); if (monthclick == 0) {map.put ("clickCount", 0); } else {map.put ("clickcount", monthclick); } list.add (แผนที่); รายการคืน; -ฉันจะแบ่งปันตัวอย่างของชาวเน็ตกับคุณซึ่งก็ดีมาก
นำเข้า java.util.concurrent.callable; นำเข้า java.util.concurrent.executorservice; นำเข้า java.util.concurrent.executors; นำเข้า java.util.concurrent.future;/** คลาสที่ใช้อินเทอร์เฟซที่เรียกได้และคลาสที่ใช้งาน Runnable เป็นงานที่สามารถดำเนินการได้โดยเธรดอื่น ๆ * callable และ runnable มีความแตกต่างหลายประการ: * (1) วิธีการที่ระบุโดย callable คือ call () ในขณะที่วิธีการที่ระบุโดย runnable คือ run () * (2) งานที่เรียกได้สามารถส่งคืนค่าหลังจากดำเนินการในขณะที่งาน runnable ไม่สามารถส่งคืนค่าได้ * (3) วิธีการโทร () สามารถโยนข้อยกเว้นได้ในขณะที่วิธีการเรียกใช้ () ไม่สามารถโยนข้อยกเว้นได้ * (4) เรียกใช้งานที่เรียกได้และคุณสามารถรับวัตถุในอนาคตได้ อนาคตแสดงถึงผลลัพธ์ของการคำนวณแบบอะซิงโครนัส * มันมีวิธีการตรวจสอบว่าการคำนวณเสร็จสมบูรณ์หรือไม่เพื่อรอการคำนวณที่จะเสร็จสมบูรณ์และเพื่อดึงผลลัพธ์ของการคำนวณ * ผ่านวัตถุในอนาคตคุณสามารถเข้าใจสถานะการดำเนินงานงานยกเลิกการดำเนินงานและยังได้รับผลลัพธ์ของการดำเนินงาน */คลาสสาธารณะ callableandfuture {/***ปรับแต่งคลาสงานเพื่อใช้งานอินเตอร์เฟส callable*/คลาสคงที่ mycallableClass ใช้ callable {// flag บิต bit private flag = 0; mycallableClass สาธารณะ (int flag) {this.flag = flag; 0 ";} if (this.flag == 1) {// ถ้าค่าของธงคือ 1 ให้ลองลูปอนันต์ลอง {ในขณะที่ (จริง) {system.out.println (" การวนซ้ำ ... "); thread.sleep (2000);}} catch (interruptedexception e) ไม่ใช่ 0 หรือ 1 จากนั้นจะมีการโยนข้อยกเว้น ข้อยกเว้นใหม่ ("ค่าธงไม่ดี!");}}} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// กำหนด 3 ประเภท callable งาน mycallableClass task1 = mycallableClass ใหม่ (0); Task ExecutorService ES = Executors.NewFixedThreadPool (3); ลอง {// ส่งและดำเนินการงาน วัตถุในอนาคตจะถูกส่งคืนเมื่อเริ่มงาน // หากคุณต้องการได้ผลลัพธ์ของการดำเนินงานหรือข้อยกเว้นคุณสามารถใช้งานวัตถุในอนาคตได้ Future Future1 = es.submit (task1); // รับผลลัพธ์ของงานแรก หากมีการเรียกเมธอด GET เธรดปัจจุบันจะรอให้งานดำเนินการก่อนที่จะดำเนินการ System.out.println ("task1:" + Future1.get ()); Future 2 = es.submit (task2); // รอ 5 วินาทีก่อนหยุดงานที่สอง เนื่องจากภารกิจที่สองเป็นเธรดลูปอนันต์ sleep (5000); system.out.println ("task2 ยกเลิก:" + future2.cancel (true)); // รับผลงานที่สามเพราะการดำเนินงานที่สาม Future3.get ());} catch (Exception e) {system.out.println (e.toString ());} // หยุดบริการการดำเนินการงาน es.shutdownnow ();}}ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ หากคุณต้องการโปรดดูที่มัน