gpt4 book ai didi

java - 如何使用 ImageReader.abort()?

转载 作者:行者123 更新时间:2023-12-01 19:11:19 25 4
gpt4 key购买 nike

我正在使用 javax.imageio.ImageReader 加载可能较大的图像对于 GUI 中的缩略图生成,以及当用户导航到不同的文件夹(在 Swing 线程上)时,我希望能够中断缩略图生成器的线程,而无需等待当前图像完成加载。所以我尝试调用 ImageReader 的 abort() 方法。但每次我都会收到这样的提示:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to use instance of com.sun.imageio.plugins.jpeg.JPEGImageReader@18e8541 locked on thread Thread[Thumbnail generator,2,main] from thread Thread[AWT-EventQueue-0,6,main]
at com.sun.imageio.plugins.jpeg.JPEGImageReader.setThreadLock(JPEGImageReader.java:1491)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.abort(JPEGImageReader.java:1285)
at ThumbnailGenerator.setDoWork(ThumbnailGenerator.java:81)
at FileList.navigateTo(FileList.java:93)
at App.navigateTo(App.java:199)
at App.navigateUp(App.java:207)
at App$EventListener.keyPressed(App.java:234)
at java.awt.AWTEventMulticaster.keyPressed(AWTEventMulticaster.java:233)
at java.awt.Component.processKeyEvent(Component.java:6246)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2801)
at java.awt.Component.processEvent(Component.java:6065)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4651)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
at java.awt.Component.dispatchEventImpl(Component.java:4523)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:616)
at java.awt.EventQueue$2.run(EventQueue.java:614)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

我很困惑。如果您无法从不同线程调用abort(),那么您应该如何调用它呢? (文档说中止状态在开始加载图像时被清除。)我也尝试过 thread.interrupt() 但它没有效果。

最佳答案

在您自己的 IIOReadProgressListener 内部调用 abort()。

http://docs.oracle.com/javase/1.4.2/docs/guide/imageio/spec/apps.fm7.html

当然,推迟到稍后可能仍然有用,因为我怀疑响应不会立即发生:

 SwingUtilities.invokeLater(new Runnable() { ... });

关于java - 如何使用 ImageReader.abort()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8298821/

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