java - 黑莓 - 线程没有响应

标签 java multithreading blackberry invoke invokelater

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

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

Uncaught exception:Application "my app name(201)" is not responding; process terminated

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

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

有什么建议吗?

为了扩展我的帖子,问题是由于我从其他线程中多次调用此代码:-

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

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

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

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

最佳答案

你说得完全正确:

I thought perhaps the issue might lie with me using a "InvokeLater" function to update my GUI with the threads progression, I am spamming this pretty hard and I fear its destroying my thread.

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

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

在 UI 更新代码中,您获取锁并尽快将数据移出累加器,并将 boolean 值标记为 false,以表明不再有 UI Worker 计划清空累加器。

关于java - 黑莓 - 线程没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6023201/

相关文章:

java - Spring XD 使用自定义 TCP 序列化器

java - 将 SOAP 响应转换为 xstream 对象

java - 设置属性以在 apache Camel 中编写 groovy 组件脚本

java - 同步块(synchronized block)实现上的差异

java - 黑莓运行时错误 : FRIDG: could not find img/logo. png

java - 如何在具有即时消息功能的应用程序中保持黑莓套接字连接

java - 线程 "AWT-EventQueue-1"中的异常

java - Android中线程的合理使用

.net - AutoResetEvent 类型是原子开关的合适选择吗?

service - 在 java blackberry 中运行定期后台服务的最佳方法