Als ich in meinem zweiten Jahr war, habe ich einen Kursdesign und einen Bildmanager gemacht. Zu dieser Zeit stieß ich mit vielen Bildern Ordner, und die Ladereihenfolge war sehr langsam. Obwohl ich versuchte, Bilder mit mehreren Threads zu laden, konnte ich nicht garantieren, dass die Bilder in der Reihenfolge geladen würden. Bis heute habe ich gelernt, die Callable -Schnittstelle und die zukünftige Schnittstelle zu verwenden, also habe ich diese Funktion aus einer Laune heraus erkannt.
Sag nicht viel Unsinn, schau dir den Code an.
Multithread -Bildbelastung (Kern):
Paket com.lin.imagemgr; import java.awt.dimension; import Java.awt.image.buffenedimage; Import Java.io.file; Import Java.io.filenameFilter; Import Java.io.io.ioxception; java.util.concurrent.executorservice; import Java.util.concurrent.executors; Import Java.util.Concurrent.future; Imagemgr {private static imagemgrin instance = new imageMGR (); private imagemgr () {} public static imagemgr getInstance () {return Instance; } // Thread Pool Private ExecutorService Executor = Executors.NewFixed threadpool (8); öffentliche Liste <Jlabel> LoadImages (String -Pfad) {list <Jlabel> Images = New ArrayList <> (); Datei Datei = neue Datei (Pfad); if (! file.isdirectory ()) {neue runTimeException ("Need Directory!"); } File [] Datei = Datei.ListFiles (neuer DateinameFilter () {@Override public boolean ACCEPTION (Datei DIR, String -Name) {// Thumbnail unterstützt nur JPG ?? if (name.endswith (". JPG") {return true;} return;}}}}); // Gleichzeitig das Bild laden und in Zukunft die Ladeergebnisliste speichern <Future <MyLabel >> futures = new ArrayList <> (); für (endgültige Datei f: Dateien) {Future <MyLabel> Future = Executor.Submit (() -> {Neue MyLabel zurückgeben (f.getName (), f.getabsolutepath ());}); futures.add (Zukunft); } // Warten auf alle gleichzeitigen Ladungen, um das Ergebnis zurückzugeben. Images.Add (Icon); }} catch (interruptedException e) {e.printstacktrace (); } catch (executionException e) {e.printstacktrace (); } // java8 verwendet die Stream -API, um die Liste <Jlabel> sortEdList = images.stream () zu sortieren. SortED (). Collect (collectors.tolist ()); Rückgabesortierliste; } // JLabel erben und vergleichbare Schnittstelle implementieren, um JLabel private statische Klasse MyLabel zu sortieren. privater String -Dateiname; public myLabel (String -Dateiname, String FullPath) {this.FileName = Dateiname; // Verwenden Sie einen Vorschaubild, um Miniaturansichten zu generieren. Seticon (neues Imageicon (BufferedImage)); setPreferredSize (neue Dimension (100, 120)); } catch (ioException e) {e.printstacktrace (); }} @Override public int vergleicheto (mylabel o) {int result = this.filename.comPareto (O.FileName); Rückgabeergebnis; }}}Schwungschnittstelle:
Paket com.lin.imagemgr; import java.awt.borderlayout; import Java.awt.Dimension; Import Java.awt.flowlayout; Import Java.util.list; Import Javax.swing.jbutton; javax.swing.jscrollpane; import javax.swing.jtextfield; public class Mainframe erweitert JFrame {private statische endgültige lange Serialversionuid = 1L; Private JTextfield Pathfield; Privat Jbutton Showbtn; Private Jpanel Contentpanel; public void init () {jpanel toppanel = new Jpanel (New FlowLayout (FlowLayout.Left, 5, 0)); toppanel.setPreferredSize (neue Dimension (800, 40)); Pathfield = New JTextField (50); ShowBtn = new Jbutton ("Show Picture"); toppanel.add (Pathfield); toppanel.add (showBtn); getContentPane (). add (borderLayout.north, toppanel); contentPanel = new jpanel (); contentPanel.setLayout (neuer FlowLayout (FlowLayout.Left, 5, 5)); contentPanel.setPreferredSize (neue Dimension (750, 1800)); JScrollPane jsp = new JScrollPane (ContentPanel); getContentPane (). add (BorderLayout.Center, JSP); showBtn.addactionListener ((e) -> {try {loadImages ();} catch (exception ex) {ex.printstacktrace ();}}); SetSize (800, 650); setDefaultCloseOperation (jframe.exit_on_close); setLocationRelativeto (null); setvisible (wahr); } public void loadImages () {contentPanel.removeall (); String path = pathfield.getText (); Long start = system.currentTimemillis (); List <Jlabel> Images = Imagemgr.getInstance (). LoadImages (Pfad); für (jLabel label: bilder) {contentPanel.add (label); } contentPanel.updateui (); Long End = System.currentTimemillis (); System.out.println ("Laden erfordert" + (Ende - Start) + "Millisekunden!"); } public static void main (String [] args) {new Mainframe (). init (); }}Auslaufergebnisse
Auf meinem Computer dauerte 1568 Millisekunden, um 92 Bilder zu laden und sie insgesamt auf die Schnittstelle zu rendern. Sie können einen Ordner mit vielen Bildern finden und versuchen, viele Bilder zu laden.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.