私が2年生のとき、私はコースデザインと写真マネージャーをしました。当時、私は多くの写真でフォルダーに遭遇し、読み込み順序は非常に遅かった。複数のスレッドで写真をロードしようとしましたが、写真が整頓されることを保証することはできませんでした。今日まで、私は呼び出し可能なインターフェイスと将来のインターフェイスを使用することを学びました。そのため、この機能を気まぐれに実現しました。
ナンセンスをあまり言わないでください、コードを見てください。
マルチスレッド画像読み込み(CORE):
パッケージcom.lin.imagemgr;インポートjava.awt.dimension; Import java.awt.image.bufferedimage; Import java.io.file; Import java.io.filenamefilter; import java.io.ioexception; Import Java.util.ArrayList; Import java.util.util.current.exex java.util.concurrent.executorservice;インポートjava.util.concurrent.executors; import java.util.concurrent.future; import java.util.stream.collectors; Import javax.swing.imageicon; import javax.thubnabnavel; import.coobnabnabnal. Imagemgr {private static imagemgr instance = new ImageMgr(); private imagemgr(){} public static imagemgr getInstance(){return instance; } //スレッドプールプライベートexecutorservice executor = executors.newfixedthreadpool(8);パブリックリスト<Jlabel> loadimages(string path){list <jlabel> images = new arrayList <>(); file file = new file(path); if(!file.isdirectory()){throw new RuntimeException( "Need Directory!"); } file [] files = file.listfiles(new filenamefilter(){@override public boolean accept(file dir、string name){// thumbnailはjpg ?? if(name.endswith( "。jpg"){return true;} return false;}}); //画像を同時にロードし、未来を使用して読み込み結果リストを保存<future <mylabel >> futures = new arrayList <>(); for(final file f:files){future <mylabel> future = executor.submit(() - > {return new mylabel(f.getname()、f.getabsolutepath();}); Futures.Add(Future); } //すべての同時負荷が結果を返すのを待っています{for(future <mylabel> future:futures){mylabel icon = future.get(); Images.Add(アイコン); }} catch(arturnedexception e){e.printstacktrace(); } catch(executionException e){e.printstacktrace(); } // java8はストリームAPIを使用してリスト<jlabel> sortedlist = images.stream()。sorted()。collect(collectors.tolist()); sortedlistを返します。 } // jlabelを継承し、同等のインターフェイスを実装してjlabel private static class mylabel extends Jlabel emplementsを拡張しますプライベート文字列ファイル名; public mylabel(string filename、string fullpath){this.filename = filename; //サムネイレーターを使用してサムネイルを生成するtry {bufferedimage bufferedimage = thumbnails.of(fullpath).size(100、120).asbufferedimage(); Seticon(新しいImageCon(BuffereDimage)); setPreferredSize(new Dimension(100、120)); } catch(ioexception e){e.printstacktrace(); }} @Override public int compareto(mylabel o){int result = this.filename.compareto(o.filename);返品結果; }}}スイングインターフェイス:
パッケージcom.lin.imagemgr;インポートjava.awt.borderlayout;インポートjava.awt.dimension; import java.awt.flowlayout; import java.util.list; import javax.swing.jbutton; Import javax.swing.jframe; Import.javax.swing.swing.javax.swing.swing.swing.swing.swing.swing。 javax.swing.jscrollpane; Import javax.swing.jtextfield; public class mainframeはjframe {private static final long serialversionuid = 1l;プライベートJTextfield Pathfield;プライベートjbutton showbtn;プライベートJPanel ContentPanel; public void init(){jpanel toppanel = new jpanel(new flowlayout(flowlayout.left、5、0)); toppanel.setPreferredSize(新しい次元(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(新しい次元(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(){contentSpanel.removeall(); string path = pathfield.getText(); long start = system.currenttimemillis();リスト<JLabel>画像= ImageMgr.getInstance()。loadimages(path); for(jlabel label:images){contentspanel.add(label); } contentPanel.updateUi(); long end = system.currenttimemillis(); System.out.println( "読み込みには" +(end -start) + "milliseconds!"); } public static void main(string [] args){new MainFrame()。init(); }}実行結果
私のコンピューターでは、92枚の写真をロードして合計でインターフェイスにレンダリングするのに1568ミリ秒かかりました。たくさんの写真を備えたフォルダーを見つけて、たくさんの写真をロードしてみてください。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。