gpt4 book ai didi

java - imgscalr AsyncScalr 的示例代码

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:58:45 26 4
gpt4 key购买 nike

有人可以分享使用 AsyncScalr 调整代码大小的 imgscalr 示例代码吗?我正在尝试使用 imgscalr(Scalr 类)进行图像处理。这是一个很好且易于使用的库,但是,经常会出现 OutOfMemoryException。我希望使用 AsyncScalr 可以解决我的低负载问题。

最佳答案

如果您熟悉 Java 并发库,那么使用 AsyncScalr 类非常简单;如果您不熟悉新的并发库,那么要点是:

  1. 调用一个 API 方法,在未来未知的时间点做一些工作;方法调用返回 Future包装实际工作。
  2. 原来的 API 调用实际上是在内部排队工作;如果它不忙,它可能会立即完成工作,但如果它很忙并且队列很大,则可能需要一段时间才能完成工作(在这种情况下,“工作”是图片)。
  3. 想要结果的调用代码(您的代码)可以继续工作直到 Future.isDone()返回 true 以指示工作已完成,或者调用代码可以阻塞,直到通过调用以下操作完成操作:Future.get() -- 此方法返回工作结果,在本例中为表示缩放结果的 BufferedImage。

代码最终看起来像这样:

// Block until result is done
BufferedImage result = AsyncScalr.resize(origImage, 125).get();

此代码与使用 Scalr class 的区别直接的是,在多线程系统中,如果您从所有线程调用 Scalr.resize() (或任何图像操作),这些线程中的每一个都将开始一个昂贵的图像操作,使您的 CPU 充满并发工作并减慢系统的速度(扼杀在其上运行的其他进程,如数据库或网络服务器)。

使用 AsyncScalr class您可以从任意数量的线程安全地调用 AsyncScalr.resize(或任何其他操作),而不必担心主机系统会被工作淹没; AsyncScalr.THREAD_COUNT确定一次可以同时发生多少个作业;如果主机还托管其他重要服务,如数据库或 Web 服务器,您通常希望将其设置为主机上的核心数或少于核心数(以确保您不会扼杀其他缩放变得繁忙时的进程)。

您可以在应用程序启动时使用“imgscalr.async.threadCount”系统属性在命令行上设置此线程值;默认情况下它是“2”,但如果您担心系统内存太低,您可以将它设置为“1”。

或者,如果您在等待结果时线程可以做一些工作,您可以做这样的事情来真正充分利用异步编程:

// Queue up the scaling operation (or any other op)
Future<BufferedImage> result = AsyncScalr.resize(origImage, 125);

/*
* You can do other work here that doesn't need 'result', like making
* DB calls, cleaning up temp files or anything else you might need to
* do.
*/

// Now we are all done and need the resulting image, so we wait for it.
BufferedImage scaledImage = result.get();

// Do something with the image...

如果您在等待图像缩放时有大量其他工作可以做,您可以简单地循环 result.isDone() 并保持工作直到缩放操作完成;但是,如果您只有离散/特定数量的工作要做,则无需在 isDone 上循环,只需完成工作,然后调用 Future.get() 获取结果(或阻塞直到它准备好了)。

希望对您有所帮助!

关于java - imgscalr AsyncScalr 的示例代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9753016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com