Quand j'étais dans ma deuxième année, j'ai fait un gestionnaire de conception et d'image. À ce moment-là, j'ai rencontré des dossiers avec de nombreuses photos, et l'ordre de chargement était très lent. Bien que j'aie essayé de charger des images avec plusieurs threads, je ne pouvais pas garantir que les images seraient chargées dans l'ordre. Jusqu'à aujourd'hui, j'ai appris à utiliser l'interface appelable et l'interface future, j'ai donc réalisé cette fonction sur un coup de tête.
Ne dites pas beaucoup de bêtises, regardez le code.
Chargement d'images multithread (noyau):
package com.lin.imagemgr; Importer java.awt.dimension; import java.awt.image.bufferedImage; import java.io.file; import java.io.filenamefilter; import java.itil.concurrent.exectionException; import; java.util.concurrent.execcutorService; import java.util.concurrent.execUtors; import java.util.concurrent.future; importer java.util.stream.collectors; import javax.swing.imageicon; importer javax.swing.jlabel; import net.coobird.thumbrotor.Thaulailat. ImageMGR {private static ImageMgr instance = new ImageMgr (); ImageMgr privé () {} public static ImageMgr getInstance () {return instance; } // Thread Pool Private ExecutorService exécutor = exécutor.NewFixEdThreadPool (8); public List <JLabel> LoadImages (String Path) {list <JLabel> images = new ArrayList <> (); Fichier fichier = nouveau fichier (chemin); if (! file.isDirectory ()) {Throw New RuntimeException ("Need Directory!"); } File [] files = file.listFiles (new filenameFilter () {@Override public boolean accepte (file dir, string name) {// Thumbnail uniquement jpg ?? if (name.endswith (". Jpg")) {return true;} return false;}}); // Chargez simultanément l'image et utilisez l'avenir pour enregistrer la liste de résultats de chargement <futur <myLabel >> Futures = new ArrayList <> (); pour (fichier final f: fichiers) {futur <myLabel> futur = exécutor.submit (() -> {return new MyLabel (f.getName (), f.getAbsoluTepath ());}); Futures.Add (Future); } // En attente de toutes les charges simultanées pour renvoyer le résultat essayez {pour (futur <myLabel> futur: futures) {myLabel icon = future.get (); images.add (icône); }} catch (InterruptedException e) {e.printStackTrace (); } catch (EXECUTUTIONException e) {e.printStackTrace (); } // java8 utilise l'API Stream pour trier la liste <JLabel> tridList = images.Stream (). Trid (). Collect (Collectors.tolist ()); return triEdList; } // hériter JLabel et implémenter une interface comparable pour trier JLabel la classe statique privée MyLabel étend JLabel implémente comparable <myLabel> {private static final SerialVersionUID = 1l; Nom de fichier de chaîne privée; public myLabel (String filename, string fullpath) {this.filename = filename; // Utilisez Thumbnailator pour générer une miniature essayez {BufferedImage BufferedImage = Thumbnails.of (fullPath) .size (100, 120) .AsbopeReDImage (); seticon (new ImageIcon (BufferedImage)); setPreferredSize (nouvelle dimension (100, 120)); } catch (ioException e) {e.printStackTrace (); }} @Override public int compareto (myLabel o) {int result = this.filename.compareto (o.filename); Résultat de retour; }}}Interface swing:
package com.lin.imagemgr; import java.awt.borderlayout; importer java.awt.dimension; import java.awt.flowlayout; import java.util.list; import javax.swing.jbutton; import javax.swing.jframe. javax.swing.jscrollpane; import javax.swing.jtextfield; classe publique mainframe étend jframe {private static final long SerialVersionUID = 1l; Jtexfield privé Pathfield; JBUTTON SHOWBTN privé; JPANEL privé ContentPanel; public void init () {jpanel toppanel = new JPanel (new FlowLayout (FlowLayout.left, 5, 0)); toppanel.setPreferRedSize (nouvelle 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 (new FlowLayout (FlowLayout.left, 5, 5)); ContentPanel.SetPreferRedSize (nouvelle 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 (true); } public void LoadImages () {contentPanel.RemoveAll (); String path = pathfield.getText (); Long start = System.CurrentTimemillis (); List <JLabel> images = imagemgr.getInstance (). LoadImages (path); for (JLabel Label: Images) {contentPanel.add (label); } contentPanel.updateUi (); Long End = System.Currenttimemillis (); System.out.println ("Chargement nécessite" + (end - start) + "millisecondes!"); } public static void main (String [] args) {new MainFrame (). init (); }}Résultats en cours d'exécution
Sur mon ordinateur, il a fallu 1568 millisecondes pour charger 92 photos et les rendre sur l'interface au total. Vous pouvez trouver un dossier avec beaucoup de photos et essayer de charger beaucoup de photos.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.