对不起,这个问题有点模糊,但我无法从调试中获得任何有用的信息。
我有一个线程,我使用新的Thread()调用。开始,它将运行一小段时间,我收到此消息:
未捕获的异常:应用程序“我的应用程序 name(201)“没有响应;进程 终止
现在令人沮丧的是我能够运行相同的进程,但没有线程,然后锁定我的应用程序,但我可以从我的Eclipse控制台看到它的工作没有错误。所以我知道他们在Thread上使用的函数不是错误。
我想也许问题可能在于我使用“InvokeLater”函数来更新我的GUI与线程进展,我发誓这很难,我担心它会破坏我的线程。
有什么建议吗?
要扩展我的帖子,问题是由于我从我的其他主题调用此代码ALOT: -
invokeLater(new Runnable()
{
public void run()
{
_output.setText(_output.getText() + "\n" + msg);
}
});
这构建了一个快速崩溃我的应用程序的队列。
我对该选项的解决方案是通过将此代码添加到我的函数来使用事件线程: -
synchronized(Application.getEventLock()) {
_output.setText("new text " + System.currentTimeMillis());
}
答案 0 :(得分:1)
如果在执行某些操作时对线程内的某个对象进行了同步,并且如果您的UI线程尝试在同一对象上进行同步,则它将一直阻塞,直到锁定被释放。
答案 1 :(得分:1)
你说得对:
我想也许问题可能在于我使用“InvokeLater”函数来更新我的GUI与线程进展,我发誓这很难,我担心它会破坏我的线程。
调用InvokeLater立即返回,并且队列工作以执行UI线程。问题是,如果该队列太大,操作系统将终止您的应用程序,假设UI已陷入不服务队列的程度。
我以前用来解决这个问题的解决方案是将发送到UI线程的工作分块。制作某种累加器对象,布尔标志和锁。工作线程然后抓住锁并将工作添加到累加器。布尔标志指示UI工作器代码是否被安排在将来清空累加器。如果没有,请安排您的UI更新代码。
在UI更新代码中,您获取锁定并尽快将数据移出累加器,并将布尔值标记为false,以显示不再有UI工作程序计划清空累加器。 / p>
答案 2 :(得分:0)
这可能是一个死锁,特别是如果你延长超时并仍然看到它。您可以进行线程转储并查看UI线程正在执行的操作。如果它正在等待锁定,你可能想要朝这个方向挖掘。