Я загружаю потенциально большие изображения, используя javax.imageio.ImageReader для создания миниатюр в графическом интерфейсе, и когда пользователь переходит в другую папку (в теме 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()
, но это не имеет никакого эффекта.