Java SwingWorker悬挂
我正在调试一些使用SwingWorker编写的代码,以执行数值计算和GUI更新的混合。SwingWorker使用以下堆栈跟踪挂起:Java SwingWorker悬挂,java,swing,swingworker,Java,Swing,Swingworker,我正在调试一些使用SwingWorker编写的代码,以执行数值计算和GUI更新的混合。SwingWorker使用以下堆栈跟踪挂起: Full thread dump Java HotSpot(TM) Client VM (14.3-b01 mixed mode, sharing): "SwingWorker-pool-3-thread-4" prio=6 tid=0x07fd7c00 nid=0x143c waiting on condition [0x0a33f000] java.la
Full thread dump Java HotSpot(TM) Client VM (14.3-b01 mixed mode, sharing):
"SwingWorker-pool-3-thread-4" prio=6 tid=0x07fd7c00 nid=0x143c waiting on condition [0x0a33f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at sum.ee.ui.modelviewer.ModelViewer$ModelAnimator.doInBackground(ModelViewer.java:940)
at sum.ee.ui.modelviewer.ModelViewer$ModelAnimator.doInBackground(ModelViewer.java:877)
at javax.swing.SwingWorker$1.call(SwingWorker.java:274)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at javax.swing.SwingWorker.run(SwingWorker.java:313)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
"SwingWorker-pool-3-thread-3" prio=6 tid=0x07fd7000 nid=0x11a8 waiting for monitor entry [0x0a2af000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.awt.Component.resize(Component.java:2044)
- waiting to lock <0x24b936a0> (a java.awt.Component$AWTTreeLock)
at java.awt.Component.setSize(Component.java:2035)
at java.awt.Component.resize(Component.java:2069)
at java.awt.Component.setSize(Component.java:2060)
at javax.swing.JViewport.setViewSize(JViewport.java:1038)
at javax.swing.ViewportLayout.layoutContainer(ViewportLayout.java:183)
at java.awt.Container.layout(Container.java:1421)
at java.awt.Container.doLayout(Container.java:1410)
at jsyntaxpane.components.LineNumbersRuler.updateSize(LineNumbersRuler.java:109)
at jsyntaxpane.components.LineNumbersRuler.removeUpdate(LineNumbersRuler.java:203)
at javax.swing.text.AbstractDocument.fireRemoveUpdate(AbstractDocument.java:243)
at jsyntaxpane.SyntaxDocument.fireRemoveUpdate(SyntaxDocument.java:118)
at javax.swing.text.AbstractDocument.handleRemove(AbstractDocument.java:608)
at javax.swing.text.AbstractDocument.remove(AbstractDocument.java:576)
at javax.swing.JEditorPane.setText(JEditorPane.java:1493)
at sum.ee.ui.SourceCodePanel.clearSourcePane(SourceCodePanel.java:256)
at sum.ee.ui.SourceCodePanel.access$100(SourceCodePanel.java:47)
at sum.ee.ui.SourceCodePanel$1.stateChanged(SourceCodePanel.java:209)
at sum.ee.ui.VisualizationAggregator.fireStateChanged(VisualizationAggregator.java:300)
at sum.ee.ui.VisualizationAggregator.update(VisualizationAggregator.java:97)
at sum.ee.ui.modelviewer.ModelViewer$ModelAnimator.doInBackground(ModelViewer.java:918)
at sum.ee.ui.modelviewer.ModelViewer$ModelAnimator.doInBackground(ModelViewer.java:877)
at javax.swing.SwingWorker$1.call(SwingWorker.java:274)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at javax.swing.SwingWorker.run(SwingWorker.java:313)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor
}这是因为未遵守Swing EDT规则 SwingWorker的目的是在UI事件发生时执行繁重的非UI任务,否则会阻塞UI,然后在最后更新UI 因此,你将在doInBackground()内实施举重;然后,swing完成后将在EDT上调用done(),您可以使用get()检索结果 这里的问题是,您正在SwingWorker创建的新线程中执行GUI工作。这可能导致死锁和并发问题 这包括创建所述GUI对象,即使您已经在EDT上,这些对象也应该是可运行的 行动,例如:
b = getButtonByIndex(index);
应封装在带有InvokeandWait的Runnable中。实际上修改GUI本身的东西尤其需要在它们自己的可运行程序中,甚至如果您已经在swing事件调度线程中响应按钮的按下或更改,那么您就有可能处理您已经在处理的对象
e、 g.swing正在对A进行锁定,以让您进行工作,让您对B进行工作试图对A进行锁定和工作我不是专家,但看起来您陷入了僵局。调用该方法的代码是什么样子的?嗨,Chad,谢谢你的回复。我想如果我有一个死锁,堆栈跟踪就会显示它——这通常就是它所做的。调用此函数的代码只在SwingWorker上执行()。可能是对sleep()的连续调用。当您第二次调用sleep时,线程可能仍在休眠,这可能是死锁的原因。我一直只是为工作线程创建了一个可运行对象的实例。我假设死锁,因为stacktrace说一个对象的监视器被阻塞了,一个正在等待条件。不要忘记,对线程中创建的任何对象的引用都需要返回给调用者,否则它们只存在于该线程中。我认为这两个线程都可能永远处于休眠状态,因为它是以这样的方式编写的。我很快会更新的。
ModelAnimator modelAnimator =
new ModelAnimator(delayBetweenUpdatesMilliseconds, modelIndices,
keepTrace);
for (final PropertyChangeListener listener : propertyChangeListeners) {
modelAnimator.addPropertyChangeListener(listener);
}
modelAnimator.execute();
b = getButtonByIndex(index);