Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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 SwingWorker悬挂_Java_Swing_Swingworker - Fatal编程技术网

Java 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

我正在调试一些使用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.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);