Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ImageIO-读取不同文件并发问题?_Java_Multithreading_Kotlin_Javax.imageio - Fatal编程技术网

Java ImageIO-读取不同文件并发问题?

Java ImageIO-读取不同文件并发问题?,java,multithreading,kotlin,javax.imageio,Java,Multithreading,Kotlin,Javax.imageio,我目前正在写一个程序,它可以批量处理不同的图像。因此,我认为并行执行操作(缩放/添加水印)可能是明智的 问题是我得到了以下错误: Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.NullPointerException at java.base/java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:1006)

我目前正在写一个程序,它可以批量处理不同的图像。因此,我认为并行执行操作(缩放/添加水印)可能是明智的

问题是我得到了以下错误:

    Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.NullPointerException
    at java.base/java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:1006)
    at eu.reisihub.soft.watermarking.Main$main$2$2$2$2.invoke(Main.kt:62)
    at eu.reisihub.soft.watermarking.Main$main$2$2$2$2.invoke(Main.kt:19)
    at kotlin.sequences.TransformingSequence$iterator$1.next(Sequences.kt:149)
    at kotlin.sequences.TransformingSequence$iterator$1.next(Sequences.kt:149)
    at kotlin.sequences.SequencesKt___SequencesKt.count(_Sequences.kt:1006)
    at eu.reisihub.soft.watermarking.Main.main(Main.kt:66)
Caused by: java.lang.NullPointerException
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
    at java.base/java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:603)
    ... 7 more
Caused by: java.lang.NullPointerException
    at java.desktop/java.awt.color.ICC_Profile.intFromBigEndian(ICC_Profile.java:1784)
    at java.desktop/java.awt.color.ICC_Profile.getNumComponents(ICC_Profile.java:1476)
    at java.desktop/sun.java2d.cmm.lcms.LCMSTransform.<init>(LCMSTransform.java:93)
    at java.desktop/sun.java2d.cmm.lcms.LCMS.createTransform(LCMS.java:173)
    at java.desktop/java.awt.color.ICC_ColorSpace.fromRGB(ICC_ColorSpace.java:230)
    at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.setImageData(JPEGImageReader.java:808)
    at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method)
    at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(JPEGImageReader.java:723)
    at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:347)
    at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:493)
    at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:716)
    at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1173)
    at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1153)
    at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1468)
    at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1363)
    at eu.reisihub.shot.UtilsKt.readImage(Utils.kt:19)
    at eu.reisihub.soft.watermarking.WatermarkUtils$create$1.invoke(WatermarkUtils.kt:18)
    at eu.reisihub.soft.watermarking.WatermarkUtils$create$1.invoke(WatermarkUtils.kt:8)
    at eu.reisihub.soft.watermarking.Main$sam$java_util_concurrent_Callable$0.call(Main.kt)
    at java.base/java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1448)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1603)
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
请参阅代码中的
println
?我知道,每个图像都会创建一个新的
com.sun.imageio.plugins.jpeg.JPEGImageReader
对象。这将性能提高到我刚才所说的7秒。通常不工作2-4次,然后工作6-10次

复杂版本的stacktrace如下所示:

Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.NullPointerException
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at eu.reisihub.soft.watermarking.Main$main$1$2$2$2$2.invoke(Main.kt:64)
    at eu.reisihub.soft.watermarking.Main$main$1$2$2$2$2.invoke(Main.kt:20)
    at kotlin.sequences.TransformingSequence$iterator$1.next(Sequences.kt:149)
    at kotlin.sequences.TransformingSequence$iterator$1.next(Sequences.kt:149)
    at kotlin.sequences.SequencesKt___SequencesKt.count(_Sequences.kt:1006)
    at eu.reisihub.soft.watermarking.Main$main$1.invoke(Main.kt:68)
    at eu.reisihub.soft.watermarking.Main$main$1.invoke(Main.kt:20)
    at eu.reisihub.shot.UtilsKt.measured(Utils.kt:54)
    at eu.reisihub.soft.watermarking.Main.main(Main.kt:24)
Caused by: java.lang.NullPointerException
    at java.awt.color.ICC_Profile.intFromBigEndian(ICC_Profile.java:1782)
    at java.awt.color.ICC_Profile.getNumComponents(ICC_Profile.java:1474)
    at sun.java2d.cmm.lcms.LCMSTransform.<init>(LCMSTransform.java:98)
    at sun.java2d.cmm.lcms.LCMS.createTransform(LCMS.java:173)
    at java.awt.color.ICC_ColorSpace.fromRGB(ICC_ColorSpace.java:218)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.setImageData(JPEGImageReader.java:694)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(JPEGImageReader.java:609)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:347)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:481)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:602)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1059)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1039)
    at eu.reisihub.shot.UtilsKt.readImage(Utils.kt:39)
    at eu.reisihub.soft.watermarking.WatermarkUtils$create$1.invoke(WatermarkUtils.kt:16)
    at eu.reisihub.soft.watermarking.WatermarkUtils$create$1.invoke(WatermarkUtils.kt:8)
    at eu.reisihub.soft.watermarking.Main$sam$java_util_concurrent_Callable$0.call(Main.kt)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)
如果要执行程序,可以使用创建JSON设置(主应用程序需要其路径)

我感谢你的任何意见。在目前的情况下,我不知道什么是错的

顺便说一句:对于我正在使用的一些任务:

有一个用于OpenJDK的名为“多线程应用程序中来自ICC_Profile.getInstance()的NullPointerException”的文件。撰写本文时没有解决方案。

OpenJDK有一个名为“多线程应用程序中来自ICC_Profile.getInstance()的NullPointerException”的解决方案。在撰写本文时没有决议。

更新2018-05-23

@haraldK在评论中提到,以前加载图像配置文件 代码:


感谢@Alex Taylor提供的OpenJDK bug链接。这让我确信我不是一个十足的白痴

而不是

fun Path.readImage(): BufferedImage =
    Files.newInputStream(this, StandardOpenOption.READ).use { ImageIO.read(it) }
我现在正在使用

fun Path.readImage(): BufferedImage =
    ImageIcon(toUri().toURL()).let {
        BufferedImage(it.iconWidth, it.iconHeight, BufferedImage.TYPE_INT_ARGB).apply {
            it.paintIcon(null, createGraphics(), 0, 0)
        }
    }
这是每一个。速度平缓,错误消失[ <强> 20 +运行> /强>!因此,IMHO
ImageIO.read
不应在多线程环境中使用……

更新2018-05-23

@haraldK在评论中提到,以前加载图像配置文件 代码:


感谢@Alex Taylor提供的OpenJDK bug链接。这让我确信我不是一个十足的白痴

而不是

fun Path.readImage(): BufferedImage =
    Files.newInputStream(this, StandardOpenOption.READ).use { ImageIO.read(it) }
我现在正在使用

fun Path.readImage(): BufferedImage =
    ImageIcon(toUri().toURL()).let {
        BufferedImage(it.iconWidth, it.iconHeight, BufferedImage.TYPE_INT_ARGB).apply {
            it.paintIcon(null, createGraphics(), 0, 0)
        }
    }

这是每一个。速度平缓,错误消失[ <强> 20 +运行> /强>!IMHO
ImageIO.read
因此不应在多线程环境中使用……

您当前的代码是什么?我链接了当前的代码:它可以在GithubIt上获得,需要在这里获得。没有人会追踪你的链接。facr中的相关代码片段是可用的
Files.newInputStream(这是StandardOpenOption.READ)。使用{ImageIO.READ(it)}
this[当从多个线程调用时]是发生异常的地方。如果这段代码是同步的,就不会发生这种情况。上下文:从所有JPG文件的列表中,创建读取一个文件的任务,错误应该是可见的。这只是一种预感,但我认为放置
ICC_Profile.getInstance(ColorSpace.CS_sRGB).getData()UtilsKt
类中的
static
初始值设定项块中的code>将修复该问题。有关更多信息,请参阅。;-)你当前的代码是什么?我链接了当前的代码:它在GithubIt上可用,需要在这里可用。没有人会追踪你的链接。facr中的相关代码片段是可用的
Files.newInputStream(这是StandardOpenOption.READ)。使用{ImageIO.READ(it)}
this[当从多个线程调用时]是发生异常的地方。如果这段代码是同步的,就不会发生这种情况。上下文:从所有JPG文件的列表中,创建读取一个文件的任务,错误应该是可见的。这只是一种预感,但我认为放置
ICC_Profile.getInstance(ColorSpace.CS_sRGB).getData()UtilsKt
类中的
static
初始值设定项块中的code>将修复该问题。有关更多信息,请参阅。;-)
fun Path.readImage(): BufferedImage =
    ImageIcon(toUri().toURL()).let {
        BufferedImage(it.iconWidth, it.iconHeight, BufferedImage.TYPE_INT_ARGB).apply {
            it.paintIcon(null, createGraphics(), 0, 0)
        }
    }