Quando eu estava no meu segundo ano, fiz um design de curso e gerente de fotos. Naquela época, encontrei pastas com muitas fotos, e a ordem de carregamento era muito lenta. Embora eu tenha tentado carregar fotos com vários threads, não poderia garantir que as imagens sejam carregadas em ordem. Até hoje, aprendi a usar a interface chamada e a interface futura, então percebi essa função por um capricho.
Não diga muita bobagem, olhe para o código.
Carregamento de imagem multithread (núcleo):
pacote com.lin.imageMgr; importar java.awt.dimension; importar java.awt.image.bufferimage; importar java.io.file; importar java.io.filenamefilter; importar java.io.ioException; importação.util.util.ArrayList; importação; java.util.concurrent.executorService; importar java.util.concurrent.executores; importar java.util.concurrent.future; importar java.util.stream.collectors; importhigMentMaGOBLENDRAIRERT; {private static imageemgr instance = new imagemgr (); private imagemgr () {} public static imagemgr getInstance () {return instância; } // Thread Pool Private ExecorsService Executor = Executores.NewfixedThreadpool (8); Lista pública <Jlabel> loadImages (String Path) {List <Jlabel> Images = new ArrayList <> (); Arquivo de arquivo = novo arquivo (caminho); if (! file.isdirectory ()) {lança nova runtimeException ("Precisa de diretório!"); } File [] arquivos = file.listfiles (new FileNameFilter () {@Override public boolean Acep (FILE Dir, Nome da String) {// Thumbnail suporta apenas jpg ?? se (name.endswith (". // carrega simultaneamente a figura e use o futuro para salvar a lista de resultados de carregamento <futura <Mylabel>> futuros = new ArrayList <> (); para (arquivo final f: arquivos) {futuro <MyLabel> futuro = executor.submit (() -> {return new MyLabel (f.getName (), f.getabsolutepath ());}); futuros.add (futuro); } // Aguardando todas as cargas simultâneas retornar o resultado, tente {for (Future <MyLabel> Future: Futures) {MyLabel ICON = FUTURO.GET.GET (); imagens.add (ícone); }} catch (interruptEdException e) {e.printStackTrace (); } catch (ExecutionException e) {e.printStackTrace (); } // java8 usa a API do fluxo para classificar a lista <Jlabel> STORDLIST = Images.Stream (). Stitled (). COLLECT (COLLECORS.TOLIST ()); Return classedList; } // herde Jlabel e implemente a interface comparável para classificar a classe estática privada jlabel mylabel estende jlabel implementa comparável <ylabel> {private static final serialversionuid = 1L; nome do arquivo de string privado; public mylabel (string filename, string fullpath) {this.filename = filename; // Use o miniário para gerar miniatura, tente {bufferImage bufferImage = miniaturas.of (fullpath) .size (100, 120) .AsBufferedImage (); Seticon (novo imageicon (bufferImage)); setPreferredSize (nova dimensão (100, 120)); } catch (ioexception e) {e.printStackTrace (); }} @Override public int compareto (mylabel o) {int resultado = this.filename.compareto (o.FileName); resultado de retorno; }}}Interface de giro:
pacote com.lin.imageMgr; importar java.awt.borderlayout; importar java.awt.dimension; importar java.awt.flowlayout; importar java.util.list; import javax.swing.jbutton; import javax.swing.jfram; javax.swing.jscrollPane; importar javax.swing.jtextfield; classe pública mainframe estende jframe {private static final long serialversionuid = 1l; Private JTextfield Pathfield; JButton particular Showbtn; Private JPanel ContentPanel; public void init () {jpanel toppanel = new jpanel (new FlowLayout (FlowLayout.Left, 5, 0)); toppanel.setPreferredSize (nova dimensão (800, 40)); Pathfield = novo 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.SetPreferSele (New Dimension (750, 1800)); JscrollPane jsp = novo jscrollPane (contentPanel); getContentPane (). Add (borderlayout.center, jsp); showbtn.addactionListener ((e) -> {try {loadImages ();} catch (exceção 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 (); Lista <Jlabel> imagens = imagemgr.getInstance (). LoadImages (caminho); para (rótulo jlabel: imagens) {contentPanel.add (Label); } contentPanel.UpDateUi (); Long end = System.currenttimemillis (); System.out.println ("Carregamento requer" + (final - Iniciar) + "milissegundos!"); } public static void main (string [] args) {new mainframe (). init (); }}Resultados de execução
No meu computador, foram necessários 1568 milissegundos para carregar 92 fotos e renderizar -as na interface no total. Você pode encontrar uma pasta com muitas fotos e tentar carregar muitas fotos.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.