java - 为什么多线程会变慢

标签 java multithreading javax.imageio

我正在尝试将 RGB 值的字节数组保存为 png 图像,如下所示:

byte[] imgArray = ...;
int canvasSize = 512;

ColorModel c = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), null, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);

Image image = Toolkit.getDefaultToolkit().createImage(
            new MemoryImageSource(canvasSize, canvasSize, c, imgArray, 0, canvasSize));

BufferedImage bimage = new BufferedImage(canvasSize, canvasSize, BufferedImage.TYPE_BYTE_GRAY);

// Draw the image on to the buffered image
Graphics2D bGr = bimage.createGraphics();
bGr.drawImage(image, 0, 0, null); //This is what takes all the time
bGr.dispose();

ImageIO.write(bimage, "PNG", new File(uniqueFileName));

我正在使用 FixedThreadpool 同时保存多个图像。我使用的线程越多(最多达到我计算机上的空闲内核数),保存过程花费的时间就越长。在 6 个线程上运行的时间几乎是在一个线程上运行的两倍。

为什么多线程会花费这么长的时间?内存交换?我可以避免这个问题吗?

此外,如果我有更好的方法从数组中保存 png,请告诉我。

编辑以显示图片被保存为不同的图像,而不是相互覆盖。

最佳答案

我认为这是由不同类型的优化引起的。您正试图在一个路径中一次保存多个图像 - 这意味着需要 排队保存操作 - 这是一个 IO 绑定(bind)任务,而不是 CPU 绑定(bind)。多个保存线程在这里可能不是很有帮助。同样在非常小的(就 CPU 功率要求而言)操作中,委派线程来完成工作可能只会带来额外的开销,从而导致完成任务所需的时间延长,而不是缩短。希望这会有所帮助:)

关于java - 为什么多线程会变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35264582/

相关文章:

java - Spring Oauth2 隐式流程

java - PDFBox 文本提取 - 空输出

java - Scala Map 和 ConcurrentHashMap 抛出 java.lang.UnsupportedOperationException

java - ImageIO 可以是多线程的吗?

java - JSF 'total' 变量类似于 c :set in JSTL

c - 具有 sigev_notify = SIGEV_THREAD_ID 方法的 POSIX 计时器

multithreading - 具有协程异步构造的自定义线程池

java - 如何同时处理IOException和IIOException

java - Jetty Embedded, Jersey 2, Weld