Java - 使用 ImageIO 进行多线程处理

2023-12-12

我有一个程序加载缓慢,我猜这是由于我一开始必须加载的图像资源量所致。我认为多线程会有所帮助,但现在我不太确定。这是我的自动多线程方法。

    private static Thread[] t;

    private static int currentThreads;

    public static void loadWithThreads(Object[] array, IntegerRunnable r) {

        final int threads =  Runtime.getRuntime().availableProcessors();
        t = new Thread[threads];

        for (int i = 0; i < threads; i ++) {
            t[i] = new Thread("HMediaConverter") {

                final int id = currentThreads;

                int items = (array.length / threads) * currentThreads;


                @Override
                public void run() {

                    super.run();

                    for (int i = items; i < (items + (array.length / threads)); i ++) {
                        r.run(i);
                    }

                    //Recycle this thread so it can be used for another time.
                    try {
                        t[id].join();
                        lock.notifyAll();
                        currentThreads --;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }


            };
            t[i].setPriority(Thread.MAX_PRIORITY);
            t[i].start();
            currentThreads ++;
        }
    }

这是我的图像加载代码:

public static ImageIcon loadImageIcon(String path) {
    return new ImageIcon(ImageIO.read(Tools.class.getClassLoader().getResource(path));
}

当然有办法加快速度吗?我在完美的 Intel i5 上运行它,它不应该这么慢,所以它一定是我的代码。


正在加载 113 张图片,总共 159.14mb...

public static void loadWithoutThreads(File[] array) {
    for (File file : array) {
        try {
            ImageIO.read(file);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

花了~15秒

With...

public static void loadWithThreads(File[] array) {

    final int threads = Runtime.getRuntime().availableProcessors();
    t = new Thread[threads];

    CountDownLatch latch = new CountDownLatch(threads);

    for (int i = 0; i < threads; i++) {
        t[i] = new Thread("HMediaConverter") {
            final int id = currentThreads;

            int items = (array.length / threads) * currentThreads;

            @Override
            public void run() {
                try {
                    System.out.println("Starting " + id);

                    for (int i = items; i < (items + (array.length / threads)); i++) {
                        try {
                            System.out.println(i + ": " + array[i]);
                            ImageIO.read(array[i]);
                        } catch (IOException ex) {
                            ex.printStackTrace();
                        }
                    }
                } finally {
                    latch.countDown();
                }

            }

        };
        t[i].setPriority(Thread.MAX_PRIORITY);
        System.out.println("Start " + i);
        t[i].start();
        currentThreads++;
    }

    try {
        latch.await();
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }
}

花了~11秒

With...

public static void loadWithExecutor(File[] images) {
    ExecutorService service = Executors.newFixedThreadPool(2);
    List<ImageLoadingTask> tasks = new ArrayList<>(images.length);
    for (File file : images) {
        tasks.add(new ImageLoadingTask(file));
    }
    try {
        List<Future<BufferedImage>> results = service.invokeAll(tasks);
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }
    service.shutdown();
}

public static class ImageLoadingTask implements Callable<BufferedImage> {

    private File file;

    public ImageLoadingTask(File file) {
        this.file = file;
    }

    @Override
    public BufferedImage call() throws Exception {
        return ImageIO.read(file);
    }

}

Took ~7s

The ExecutorService效率更高,因为当一个线程处理较大文件时,另一个线程可以处理许多小文件。这是通过池化那些在需要时不做任何工作的线程来实现的,允许一个线程执行大量短期工作,而其他线程也很忙。你不需要等待那么久

看一下执行者更多细节

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java - 使用 ImageIO 进行多线程处理 的相关文章

随机推荐

  • 在同一测试中重用 pytest 夹具

    下面是使用的测试代码示例user用于设置测试的夹具 pytest fixture def user Setup db connection yield User email protected Close db connection def
  • 在子类的回调方法中调用父类的方法

    我有两个类 B 类扩展了 A 类 在 B 类中 我正在执行一些画布操作 因此需要调用回调来加载图像 在回调中我想调用父类的相同方法 但是 如果我将这行代码放入回调中 则会出现语法错误 Uncaught SyntaxError super 关
  • Scala 未来应用程序在完成之前终止

    只是试图让我的第一个 future 使用并运行 并进行类似于 Akka in Action MEAP 书中概述的示例的测试 我想调用一个网络服务并在将来返回结果 我正在使用 scalaxb 访问 Web 服务 我已经概述了下面的代码 但是当
  • 使用 Twilio SMS API,我可以在一篇文章中指定多个目标电话吗?

    Twilio 将长代码 SMS 限制为 1 次 秒 为了提高吞吐量 我将批次分成 5 个电话号码 我发现 Twilio API 的每个 HTTP POST 大约需要 0 5 秒 人们可能会认为使用 5 个 twilio 电话号码向 1000
  • 用于嵌套 Div 标签的 PHP 正则表达式

    我需要一个可以与 PHP 的 preg match all 一起使用的正则表达式来匹配 div 标签内的内容 div 看起来像这样 div Content div 到目前为止 我已经想出了这个正则表达式 它匹配所有 id t number
  • 如何计算firebase实时数据库中的键数

    如何在 firebase 函数的帮助下计算键的数量 在上面的情况下有 3 个 我正在使用 firebase 实时数据库 Firebase 实时数据库没有单独的计数操作 您必须下载父节点的整个快照 geoTag 然后计算应用程序代码中的子级数
  • C# - Json POST 请求已发送,但 PHP 服务器未收到

    我正在从 C Windows 表单应用程序向 OpenShift Red Hat 上托管的 PHP 服务器发送 HTTP 请求 我正在使用 POST 方法和 Json 数据 问题是 数据似乎已正确发送 我在wireshark中看到数据包 p
  • 如何将jax-ws服务部署到eclipse或tomcat?

    作为一名 Web 服务初学者 我已经尝试了 2 周来获得一个与 Maven Eclipse 和 Tomcat 一起使用的 hello World Web 服务 我放弃了让任何代码 wsdl 生成器工作的尝试 我遵循了本教程http myar
  • 猫鼬鉴别器在数据库中有何帮助? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 你好 我正在学习 mongodb 我了解了 mongoose 中的鉴别器 我试图从文档方面理解它 但不太理解 任何人都可以用更好的方式解释吗 谢谢 举个例子 您的项目有两个角色
  • 图像和其他 div 彼此相邻的 Div 容器 [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我正在尝试绘制一个容器 其中包含左侧的图像 缩略图 和图像旁边的几个 div 垂直 在容
  • 检查多维数组中是否存在特定的数组键 - PHP

    我有一个多维数组 例如 这可能有很多层次 array Array 21 gt Array 24 gt Array 22 gt Array 25 gt Array 26 gt Array 我试图循环它以查看某个键是否存在 keySearch
  • NVD3 中的 ScatterChart – 从 csv 文件读取数据

    我正在尝试从 csv 文件读取数据 并希望使用 NVD3 中的 scatterChart 来可视化该数据 我会链接到 JSfiddle 或类似的东西 但我不知道如何在这些在线 JavaScript IDE 中包含 csv 文件 那可能吗 c
  • 分割字符串,然后显示没有最后一个的所有项目

    我有 例如 字符串let abc Jonny Name 所以如果我想检查 这是不是名字 我会检查 let isName abc split 1 isName Name your name is abc split 0 not name 但我
  • 同一服务器上的多个 Mongodb 实例

    我正在使用 Mongo DB 但我是它的新手 我准备将它安装在专门用于 Mongo 的服务器上 我想创建它的 2 个实例 1 个用于支持 QA 环境 另一个用于支持临时环境 我更熟悉 SQL Server 我可以在其中创建多个实例 是否可以
  • 在 CLI 中生成随机 BMP

    我需要一个真正随机的 BMP 来测试各种有损图像压缩算法 理想情况下 这不会依赖于任何库并在 Linux CLI 中运行 它应该生成一个随机的 BMP 给定一定的width and height 更新答案 2021 年 4 月 以下是关于随
  • 如何使用 LWP::Simple 处理代理服务器?

    如何向该脚本添加代理支持 use LWP Simple url http stackoverflow com word how to ask content get url if content m word print Found wor
  • 如何从电子表格公式调用库函数作为自定义函数?

    这可能是与以下相同的根本原因如何从同一库生成的电子表格下拉菜单中调用库函数 但我仍然想把它扔掉 以防出现新的情况或情况有所不同 问题是我想将所有自定义函数保留在一个库中 然后将该库添加到任何给定的电子表格中 并能够从单元格公式中引用它们 在
  • iOS UICollectionView:具有交替网格对齐方式的圆形视图的单元格

    我正在尝试实施UICollectionView用于圆形的自定义单元格 现在 默认情况下 圆的对齐方式与普通方形单元格相同 顶部圆和底部圆位于同一垂直线上 如何将对齐更改为 顶部圆和其下面的两个圆形成等边三角形 顶部圆和底部圆的位置按半径长度
  • 使用 React Route 部署到 S3 后看到空白页面

    我使用 React 和 React Router 构建了 SPA 我也在用https github com facebookincubator create react app因为它是一个非常简单的应用程序 当我使用 webpack 进行开
  • Java - 使用 ImageIO 进行多线程处理

    我有一个程序加载缓慢 我猜这是由于我一开始必须加载的图像资源量所致 我认为多线程会有所帮助 但现在我不太确定 这是我的自动多线程方法 private static Thread t private static int currentThr