1

很抱歉,这个问题有点含糊,但我无法从调试中获得任何有用的信息。

我有一个使用 new Thread().Start 调用的线程,然后它将运行一小段时间,我收到以下消息:

未捕获的异常:应用程序“我的应用程序名称(201)”没有响应;进程终止

现在令人沮丧的是我能够运行相同的进程但没有线程,这会锁定我的应用程序,但我可以从我的 Eclipse 控制台看到它的工作没有错误。所以我知道他们不是我在线程上使用的函数的错误。

我认为问题可能在于我使用“InvokeLater”函数来更新我的 GUI 与线程进程,我非常努力地发送垃圾邮件,我担心它会破坏我的线程。

有什么建议么?

为了扩展我的帖子,问题是由于我从我的另一个线程中调用了这个代码:-

 invokeLater(new Runnable() 
        {
            public void run() 
            {
                _output.setText(_output.getText() + "\n" + msg);
            }
        });

这正在建立一个队列,该队列很快使我的应用程序崩溃。

我对该选项的解决方案是通过将此代码添加到我的函数中来使用事件线程:-

   synchronized(Application.getEventLock()) {
       _output.setText("new text " + System.currentTimeMillis());
   }
4

3 回答 3

1

如果您在执行一些耗时的操作时在线程内的某个对象上进行了同步,并且如果您的 UI 线程尝试在同一个对象上进行同步,它将阻塞,直到锁被释放。

于 2011-05-16T20:50:23.533 回答
1

你完全正确:

我认为问题可能在于我使用“InvokeLater”函数来更新我的 GUI 与线程进程,我非常努力地发送垃圾邮件,我担心它会破坏我的线程。

调用 InvokeLater 立即返回,并且队列工作以供 UI 线程执行。问题是,如果该队列变得太大,操作系统将终止您的应用程序,假设 UI 已陷入无法为队列提供服务的地步。

我过去用来解决这个问题的解决方案是将发送到 UI 线程的工作分块。制作某种累加器对象、布尔标志和锁。然后工作线程获取锁并将工作添加到累加器。布尔标志指示 UI 工作程序代码是否计划在将来清空累加器。如果没有,请安排您的 UI 更新代码。

在 UI 更新代码中,您抓住锁并尽快将数据移出累加器,并将布尔值标记为 false,以表明不再有 UI 工作人员计划清空累加器。

于 2011-05-16T23:49:23.247 回答
0

这可能是一个死锁,特别是如果您延长超时并仍然看到它。您可以进行线程转储并查看 UI 线程在做什么。如果它正在等待获取锁,您可能想朝这个方向挖掘。

于 2011-05-17T01:43:20.137 回答