We are trying to convert jpg images to a specific size. Because the huge amount of pictures we decided to use the multi threaded approach with a backport of the Java 1.5 Concurrency package. (We are still using 1.4 for production)
The application in our test environment runs on Java 1.5.0_05 and Apache Tomcat 5.5.20 on Linux. Now for the real problem. I'm running the following code with 4 threads. I've read that the Graphics2D code is not thread safe, so I've synchronized it. However, the convert method hangs on the next thread dump: "pool-1-thread-3" prio=1 tid=0x8c9b81a0 nid=0x1e56 runnable [0x8a533000..0x8a5337f0] at sun.java2d.loops.ScaledBlit.Scale(Native Method) at sun.java2d.pipe.DrawImage.scaleSurfaceData(DrawImage.java:850) at sun.java2d.pipe.DrawImage.renderImageScale(DrawImage.java:505) at sun.java2d.pipe.DrawImage.tryCopyOrScale(DrawImage.java:287) at sun.java2d.pipe.DrawImage.transformImage(DrawImage.java:171) at sun.java2d.pipe.DrawImage.transformImage(DrawImage.java:947) at sun.java2d.pipe.ValidatePipe.transformImage(ValidatePipe.java:212) at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:2969) at sun.java2d.SunGraphics2D.drawRenderedImage(SunGraphics2D.java:2392) at test.ImageCallable.convert(ImageCallable.java:90) The relevant code of the ImageCallable: private static final Object GRAPHICS_MUTEX = new Object(); static { ImageIO.setUseCache(false); } private boolean convert(final ImageFormat imageFormat, final BufferedImage imageSource, final File destinationFile) { Dimension imageSize = imageFormat.getDimension(); log.debug("Scaling image '" + relativeImageFile + "' to " + imageSize.toString()); boolean success = true; try { BufferedImage bufferedImageDst = new BufferedImage(imageSize.width, imageSize.height, BufferedImage.TYPE_INT_RGB); double width = new Double(bufferedImageDst.getWidth()).doubleValue() / new Double(imageSource.getWidth()).doubleValue(); double height = new Double(bufferedImageDst.getHeight()).doubleValue() / new Double(imageSource.getHeight()).doubleValue(); AffineTransform transform = AffineTransform.getScaleInstance(width, height); //Native code behind drawRenderedImage is not thread safe. synchronized (GRAPHICS_MUTEX) { Graphics2D g = bufferedImageDst.createGraphics(); g.drawRenderedImage(imageSource, transform); // <- the problem line g.dispose(); } success = ImageIO.write(bufferedImageDst, imgFileSuffix.toUpperCase(), destinationFile); } catch (Exception e) { log.warn("Error scaling image '" + relativeImageFile + "' to " + imageSize.toString()); success = false; } return success; } Has anybody any clue what is going wrong, and how I can fix it? [Message sent by forum member 'nick_s' (nick_s)] http://forums.java.net/jive/thread.jspa?messageID=227409 =========================================================================== To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff JAVA2D-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help".