เมื่อฉันอยู่ในปีที่สองของฉันฉันได้ออกแบบหลักสูตรและผู้จัดการรูปภาพ ในเวลานั้นฉันพบโฟลเดอร์ที่มีรูปภาพมากมายและลำดับการโหลดช้ามาก แม้ว่าฉันจะพยายามโหลดรูปภาพด้วยหลายเธรด แต่ฉันไม่สามารถรับประกันได้ว่ารูปภาพจะถูกโหลดตามลำดับ จนถึงทุกวันนี้ฉันเรียนรู้ที่จะใช้อินเทอร์เฟซที่เรียกได้และอินเทอร์เฟซในอนาคตดังนั้นฉันจึงรู้ฟังก์ชั่นนี้ด้วยความตั้งใจ
อย่าพูดเรื่องไร้สาระมากดูรหัส
การโหลดรูปภาพแบบมัลติเธรด (แกน):
แพ็คเกจ com.lin.imagemgr; นำเข้า java.awt.dimension; นำเข้า java.awt.image.bufferedimage; นำเข้า java.io.file; นำเข้า java.io.filenamefilter; นำเข้า java.io.ioexception; java.util.concurrent.executorservice; นำเข้า java.util.concurrent.executors; นำเข้า java.util.concurrent.future; นำเข้า java.util.stream.collectors; นำเข้า javax.swing.imageicon; ImageMgr {อินสแตนซ์ Imagemgr แบบคงที่ส่วนตัว = new ImageMgr (); Private ImageMgr () {} ImageMgR แบบคงที่สาธารณะ getInstance () {อินสแตนซ์กลับ; } // เธรดพูล Private ExecutorService Executor = Executors.NewFixedThreadPool (8); รายการสาธารณะ <Jlabel> loadimages (เส้นทางสตริง) {รายการ <jlabel> images = new ArrayList <> (); ไฟล์ไฟล์ = ไฟล์ใหม่ (พา ธ ); if (! file.isdirectory ()) {โยน runtimeException ใหม่ ("ต้องการไดเรกทอรี!"); } file [] files = file.listfiles (ใหม่ filenamefilter () {@Override บูลีนสาธารณะยอมรับ (ไฟล์, ชื่อสตริง) {// Thumbnail รองรับ JPG เท่านั้น ?? ถ้า (name.endswith (". JPG")) // โหลดภาพพร้อมกันและใช้ในอนาคตเพื่อบันทึกรายการผลการโหลด <Future <MyLabel>> futures = new ArrayList <> (); สำหรับ (ไฟล์สุดท้าย f: ไฟล์) {อนาคต <mylabel> future = executor.submit (() -> {ส่งคืน mylabel ใหม่ (f.getName (), f.getabsolutepath ());}); futures.add (อนาคต); } // รอโหลดที่เกิดขึ้นพร้อมกันทั้งหมดเพื่อส่งคืนผลลัพธ์ลอง {สำหรับ (อนาคต <MyLabel> อนาคต: อนาคต) {myLabel icon = future.get (); images.add (ไอคอน); }} catch (interruptedException e) {e.printStackTrace (); } catch (ExecutionException E) {E.printStackTrace (); } // java8 ใช้สตรีม API เพื่อเรียงลำดับรายการ <jlabel> sortEdList = images.stream (). sorted (). collect (collector.tolist ()); Return SortedList; } // สืบทอด JLabel และใช้อินเทอร์เฟซที่เปรียบเทียบได้เพื่อเรียงลำดับ JLabel คลาสคงที่คลาสคงที่ MyLabel ขยาย JLabel ใช้งานได้เทียบเท่า <MyLabel> {ส่วนตัวคงที่ความยาวคงสุดท้าย ชื่อไฟล์สตริงส่วนตัว; myLabel สาธารณะ (ชื่อไฟล์สตริง, สตริงเต็ม pHATH) {this.filename = filename; // ใช้ Thumbnailator เพื่อสร้างรูปขนาดย่อลอง {bufferedImage bufferedImage = thumbnails.of (เต็ม path) .size (100, 120) .asbufferedimage (); seticon (imageicon ใหม่ (bufferedimage)); SetPreferredSize (มิติใหม่ (100, 120)); } catch (ioexception e) {e.printstacktrace (); }} @Override public int compereto (myLabel o) {int result = this.filename.compareto (o.filename); ผลการกลับมา; -อินเทอร์เฟซสวิง:
แพ็คเกจ com.lin.imagemgr; นำเข้า java.awt.borderlayout; นำเข้า java.awt.dimension; นำเข้า java.awt.flowlayout; นำเข้า java.util.list; นำเข้า Javax.swing.jbutton; javax.swing.jscrollpane; นำเข้า javax.swing.jtextfield; เมนเฟรมระดับสาธารณะขยาย JFrame {ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = 1L; pathfield jtextfield ส่วนตัว; JBUTTON Private JButton Showbtn; Private JPanel ContentPanel; โมฆะสาธารณะ init () {JPanel toppanel = new JPanel (Flowlayout ใหม่ (flowlayout.left, 5, 0)); toppanel.setPreferredSize (มิติใหม่ (800, 40)); pathfield = new Jtextfield (50); showbtn = ใหม่ jbutton ("แสดงภาพ"); toppanel.add (Pathfield); toppanel.add (showbtn); getContentPane (). เพิ่ม (BorderLayout.north, Toppanel); ContentPanel = new JPanel (); ContentPanel.SetLayout (Flowlayout ใหม่ (flowlayout.left, 5, 5)); ContentPanel.SetPreferredSize (มิติใหม่ (750, 1800)); JSCrollPane JSP = ใหม่ JSCrollPane (ContentPanel); getContentPane (). เพิ่ม (BorderLayout.Center, JSP); showbtn.addaCtionListener ((e) -> {ลอง {loadimages ();} catch (Exception ex) {ex.printStackTrace ();}}); setsize (800, 650); SetDefaultCloseoperation (jframe.exit_on_close); SetLocationRelativeto (NULL); setVisible (จริง); } โมฆะสาธารณะ loadimages () {contentPanel.RemoveAll (); String path = pathfield.getText (); Long Start = System.currentTimeMillis (); รายการ <jlabel> images = imagemgr.getInstance (). loadimages (พา ธ ); สำหรับ (jlabel label: images) {contentPanel.add (ฉลาก); } contentPanel.updateUi (); Long End = System.currentTimeMillis (); System.out.println ("การโหลดต้องการ" + (สิ้นสุด - เริ่มต้น) + "มิลลิวินาที!"); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {mainframe ใหม่ (). init (); -การรันผลลัพธ์
ในคอมพิวเตอร์ของฉันใช้เวลา 1568 มิลลิวินาทีในการโหลดรูปภาพ 92 ภาพและแสดงภาพลงในส่วนต่อประสานทั้งหมด คุณสามารถค้นหาโฟลเดอร์ที่มีรูปภาพจำนวนมากและพยายามโหลดรูปภาพจำนวนมาก
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น