- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有人可以分享使用 AsyncScalr 调整代码大小的 imgscalr 示例代码吗?我正在尝试使用 imgscalr(Scalr 类)进行图像处理。这是一个很好且易于使用的库,但是,经常会出现 OutOfMemoryException。我希望使用 AsyncScalr 可以解决我的低负载问题。
最佳答案
如果您熟悉 Java 并发库,那么使用 AsyncScalr 类非常简单;如果您不熟悉新的并发库,那么要点是:
代码最终看起来像这样:
// 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/
有人可以分享使用 AsyncScalr 调整代码大小的 imgscalr 示例代码吗?我正在尝试使用 imgscalr(Scalr 类)进行图像处理。这是一个很好且易于使用的库,但是,经常会出现 Ou
我在 Servlet 中使用 AsyncScalr 来缩小一些大图像(~ 10-15 兆字节),实际调整大小过程大约需要 40 毫秒,这并不多。矫枉过正来自从本地存储读取图像作为 BufferedIm
我是一名优秀的程序员,十分优秀!