亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java Swing 多線程加載圖片(保證順序一致)

 更新時間:2017年12月15日 10:26:48   作者:脫線宅  
這篇文章主要為大家詳細介紹了Java Swing 多線程加載圖片,保證順序一致,具有一定的參考價值,感興趣的小伙伴們可以參考一下

大二的時候做的課程設(shè)計,圖片管理器,當(dāng)時遇到圖片很多的文件夾,加載順序非常慢。雖然嘗試用多個Thread加載圖片,卻無法保證圖片按順序加載。直到今天學(xué)會了使用Callable接口和Future接口,于是心血來潮實現(xiàn)了這個功能。

廢話不多說,看代碼。

多線程加載圖片(核心):

package com.lin.imagemgr;

import 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.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
import javax.swing.ImageIcon;
import javax.swing.JLabel;

import net.coobird.thumbnailator.Thumbnails;

public class ImageMgr {
 private static ImageMgr instance = new ImageMgr();
 private ImageMgr() {}
 public static ImageMgr getInstance() {
  return instance;
 }

 //線程池
 private ExecutorService executor = Executors.newFixedThreadPool(8);

 public List<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;
   }
  });

  //并發(fā)加載圖片,并使用Future保存加載結(jié)果
  List<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);
  }

  //等待所有并發(fā)加載返回結(jié)果
  try {
   for (Future<MyLabel> future : futures) {
    MyLabel icon = future.get();
    images.add(icon);
   }
  } catch (InterruptedException e) {
   e.printStackTrace();
  } catch (ExecutionException e) {
   e.printStackTrace();
  }

  //Java8使用stream API 進行排序
  List<JLabel> sortedList = images.stream().sorted().collect(Collectors.toList());

  return sortedList;
 }

 //繼承JLabel并實現(xiàn)Comparable接口,從而對JLabel進行排序
 private static class MyLabel extends JLabel implements Comparable<MyLabel>{
  private static final long serialVersionUID = 1L;
  private String fileName;

  public MyLabel(String fileName, String fullPath) {
   this.fileName = fileName;
   //使用thumbnailator生成縮略圖
   try {
    BufferedImage bufferedImage = Thumbnails.of(fullPath) 
    .size(100, 120)
    .asBufferedImage();
    setIcon(new ImageIcon(bufferedImage));
    setPreferredSize(new Dimension(100, 120));
   } catch (IOException e) {
    e.printStackTrace();
   }
  }

  @Override
  public int compareTo(MyLabel o) {
   int result = this.fileName.compareTo(o.fileName);
   return result;
  }


 }

}

Swing界面:

package com.lin.imagemgr;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class MainFrame extends JFrame{
 private static final long serialVersionUID = 1L;
 private JTextField pathField;
 private JButton showBtn;
 private JPanel contentPanel;

 public void init() {
  JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));
  topPanel.setPreferredSize(new Dimension(800, 40));
  pathField = new JTextField(50);
  showBtn = new JButton("顯示圖片");
  topPanel.add(pathField);
  topPanel.add(showBtn);
  getContentPane().add(BorderLayout.NORTH, topPanel);
  contentPanel = new JPanel();
  contentPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
  contentPanel.setPreferredSize(new 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("加載需要" + (end - start) + "毫秒!");

 }

 public static void main(String[] args) {
  new MainFrame().init();
 }

}

運行結(jié)果

這里寫圖片描述

在我的電腦上,加載92張圖片并渲染到界面上,總共花了1568毫秒。大家可以找一個圖片很多的文件夾,嘗試加載大量圖片的情況。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java壓縮和解壓縮ZIP文件實戰(zhàn)案例

    Java壓縮和解壓縮ZIP文件實戰(zhàn)案例

    這篇文章主要給大家介紹了關(guān)于Java壓縮和解壓縮ZIP文件的相關(guān)資料,ZIP是一種較為常見的壓縮形式,最近項目中遇到了再Java中壓縮和解壓縮zip文件的需求,特此分享給大家,需要的朋友可以參考下
    2023-07-07
  • 淺談Java8對字符串連接的改進正確姿勢

    淺談Java8對字符串連接的改進正確姿勢

    這篇文章主要介紹了Java8:對字符串連接的改進,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用

    Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用

    這篇文章主要介紹了Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot自定義maven-plugin插件整合asm代碼插樁

    SpringBoot自定義maven-plugin插件整合asm代碼插樁

    本文主要介紹了SpringBoot自定義maven-plugin插件整合asm代碼插樁,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Spring Boot自定義favicon實現(xiàn)方法實例解析

    Spring Boot自定義favicon實現(xiàn)方法實例解析

    這篇文章主要介紹了Spring Boot自定義favicon實現(xiàn)方法實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Java中的CopyOnWriteArrayList原理詳解

    Java中的CopyOnWriteArrayList原理詳解

    這篇文章主要介紹了Java中的CopyOnWriteArrayList原理詳解,如源碼所示,CopyOnWriteArrayList和ArrayList一樣,都在內(nèi)部維護了一個數(shù)組,操作CopyOnWriteArrayList其實就是在操作內(nèi)部的數(shù)組,需要的朋友可以參考下
    2023-12-12
  • Java生成遞增流水號(編號+時間+流水號)簡單示例

    Java生成遞增流水號(編號+時間+流水號)簡單示例

    這篇文章主要給大家介紹了關(guān)于Java生成遞增流水號(編號+時間+流水號)的相關(guān)資料,在開發(fā)項目漫長的過程中常常會遇到流水號需要自動生成的問題存在,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2023-07-07
  • Mybatis中Collection集合標(biāo)簽的使用詳解

    Mybatis中Collection集合標(biāo)簽的使用詳解

    這篇文章主要介紹了Mybatis中Collection集合標(biāo)簽的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • WIN10系統(tǒng)中添加bat腳本重啟jar服務(wù)

    WIN10系統(tǒng)中添加bat腳本重啟jar服務(wù)

    在bat腳本中執(zhí)行java服務(wù),命令與cmd中類似,下面這篇文章主要給大家介紹了關(guān)于WIN10系統(tǒng)中添加bat腳本重啟jar服務(wù)的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Java實現(xiàn)List去重的方法詳解

    Java實現(xiàn)List去重的方法詳解

    本文用示例介紹Java的List(ArrayList、LinkedList等)的去重的方法。List去重的常用方法一般是:JDK8的stream的distinct、轉(zhuǎn)為HashSet、轉(zhuǎn)為TreeSet等,感興趣的可以了解一下
    2022-05-05

最新評論