Java 背景线摆动
我不知所措,一个简单使用秋千的工人。 我在doInBackground()中添加了一些简单的代码,但它不执行,我没有收到异常。当我使用Debugger时,他正在按应有的方式工作。)) 也许有人有这样的想法,或者告诉我如何隐藏这个错误,或者。。。 对不起,代码很复杂。告诉我你需要更多的东西或意见。 如果我删除“installer.setFPS(fpscaculatorghost.getFPS());”-字符串,一切都会好起来Java 背景线摆动,java,multithreading,swing,swingworker,worker,Java,Multithreading,Swing,Swingworker,Worker,我不知所措,一个简单使用秋千的工人。 我在doInBackground()中添加了一些简单的代码,但它不执行,我没有收到异常。当我使用Debugger时,他正在按应有的方式工作。)) 也许有人有这样的想法,或者告诉我如何隐藏这个错误,或者。。。 对不起,代码很复杂。告诉我你需要更多的东西或意见。 如果我删除“installer.setFPS(fpscaculatorghost.getFPS());”-字符串,一切都会好起来 java.awt.EventQueue.invokeLater(
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainWindow().setVisible(true);
}
});
public MainWindow() {
initComponents();
}
private void initComponents() {
InterfaceUpdateWorker interfaceUpdate = new InterfaceUpdateWorker(
new InterfaceInfoInstallerImpl());
interfaceUpdate.setCamera(gLEventListenerImpl.getCameraGhost());
interfaceUpdate.setfPSCalculatorGhost(gLEventListenerImpl.getFPSCalculatorGhost());
interfaceUpdate.execute();
}
@Override
protected Void doInBackground() throws InterruptedException {
while(true) {
installer.setFPS(fPSCalculatorGhost.getFPS());
installer.setCameraXPosition(
cameraGhost.getCameraXPosition());
installer.setCameraYPosition(
cameraGhost.getCameraYPosition());
installer.setCameraZPosition(
cameraGhost.getCameraZPosition());
Thread.sleep(200);
}
}
public final class FPSCalculatorGhost {
private FPSCalculatorGhost() {
}
public float getFPS() {
return fpsTask.getAvrfps();
}
}
public float getAvrfps() {
synchronized (this) {
return avrfps;
}
}
一切都围绕着任务对象。它由interfaceUpdate线程(或应用程序工作线程)使用,并由其他线程使用,在其他线程中对其进行初始化。
结果:
1). fpsTask对象在一个线程中初始化
2). fpsTask对象将值提供给另一个线程
当我将FPSCalculatorGhost中的fpsTask设置为final时,它开始工作。因此,问题在于
安装程序.setFPS(FPSCalculatorGhost.getFPS())代码>行。它有什么作用?
它调用getAvrFPS
方法,其中包含以下块:
synchronized (this) {
return avrfps;
}
只有当同一时间没有其他线程在同一对象的某个同步块或同步方法中时,才能输入此同步的块。在您发布的代码片段中没有这样的块/方法,因此您必须自己搜索它
最重要的是,确保持有锁的另一个线程没有等待来自这个工作线程的某些结果
当遇到死锁时,使用java进程的进程ID运行jstack
,以获取所有正在运行的线程的堆栈跟踪,这包括它们持有和等待的锁。(jps
提供所有java进程ID。)因此,问题在于installer.setFPS(fpsculatorghost.getFPS())代码>行。它有什么作用?
它调用getAvrFPS
方法,其中包含以下块:
synchronized (this) {
return avrfps;
}
只有当同一时间没有其他线程在同一对象的某个同步块或同步方法中时,才能输入此同步的块。在您发布的代码片段中没有这样的块/方法,因此您必须自己搜索它
最重要的是,确保持有锁的另一个线程没有等待来自这个工作线程的某些结果
当遇到死锁时,使用java进程的进程ID运行jstack
,以获取所有正在运行的线程的堆栈跟踪,这包括它们持有和等待的锁。(jps
为您提供所有java进程ID。)您能发布一些代码吗?同意Romain的观点——如果您对我们隐藏代码,我们怎么能猜出您的错误呢?我不明白当我最终确定任务时,它开始工作了你能发布一些代码吗?同意Romain的观点——如果你对我们隐藏代码,我们怎么能猜出你的错误呢?我不明白当我将fpsTask设置为final时,它开始工作了我检查,这个同步块没有影响。我是怎么说的,当我添加“installer.setFPS(fPSCalculatorGhost.getFPS())”时,工人踏板不会执行-绳子。doInBackground()函数未被调用,仅此而已。@itun:从您的源代码片段来看,这一个同步块有唯一可能的原因-如果我们能够提供更多帮助,我们需要更多的上下文。(例如,setFPS
方法)您能否构建一个仅显示您的问题的简短示例?从上面的代码片段中,我只是猜测哪个方法在哪里。我和其他人一样认为问题一定是在同步中。顺便说一句,构建一个简单的示例是一项非常有用的任务,它可以帮助您更好地隔离问题。我检查,此同步块不会影响。正如我所说,当我添加“installer.setFPS(fpscallatorghost.getFPS());”-string时,工作线程不会执行。doInBackground()函数未被调用,仅此而已。@itun:从您的源代码片段来看,这一个同步块有唯一可能的原因-如果我们能够提供更多帮助,我们需要更多的上下文。(例如,setFPS
方法)您能否构建一个仅显示您的问题的简短示例?从上面的代码片段中,我只是猜测哪个方法在哪里。我和其他人一样认为问题一定是在同步中。顺便说一句,构建一个简单的示例是一项非常有用的任务,它可以帮助您更好地隔离问题。