首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步线程IllegalStateException

同步线程IllegalStateException
EN

Stack Overflow用户
提问于 2014-02-19 09:41:02
回答 2查看 156关注 0票数 0

我已经搜索过了,这些主题似乎都没有真正的帮助,我的问题是在PopupScreen上启动一个线程,等待它完成,然后用适当的通知关闭PopupScreen,下面是我的代码

代码语言:javascript
复制
LoginThread lt  = new LoginThread(str1, str2);
lt.start();

synchronized(lt){
    try{
        lt.wait();
    }catch(InterruptedException ie){
        ie.printStackTrace();
    }
    //Everything works fine until here i add
    close();
   //Or
   this.close();

}

private class LoginThread extends Thread{
    public LoginThread(String str1, String str2){

    }

    public void run(){
        synchronized(this){
            notify();
        }
    }
}

有什么建议我可以关闭这个弹幕吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-19 10:28:23

响应者应该意识到这是一个BlackBerry Java问题,在所提供的代码中可能并不清楚这一处理对BlackBerry Java的影响。

从BlackBerry的角度来看,显示PopupScreen的原因有很多,其中之一是在进行一些后台处理时锁定用户。但是,这种锁定从来没有使用thread.wait实现。BlackBerry Ui处理使用事件驱动的模型,因为我理解它有点像Swing (我不是Swing专家)。这样做的结果是,如果您试图编写等待代码,并且试图阻止用户继续前进,那么您必须等待事件线程,这将完全阻止用户输入。如果您尝试这样做的话,BlackBerry OS就会出现这种情况(除了在模拟器上,它有时会因为某种原因允许您这样做)。

有关这方面的更多信息,请参见此处:

什么是事件线程?

在这种情况下,用户希望在长时间运行的处理完成后关闭弹出屏幕。我建议使用类似于观察者模式的模式,换句话说,让线程在完成时回调观察者( PopupScreen)。观察者(屏幕)可以关闭自己。

同时,显示的屏幕(观察者)可以忽略通常会关闭它的事件,比如'Esc‘键。这个屏幕将显示一些对用户有用的东西,比如“请等待”。

不过,有一点要注意的是,回调将发生在后台线程上,但如果要执行Ui处理,则关闭必须在事件线程上。交换到事件线程上下文通常使用如下代码:

代码语言:javascript
复制
UiApplication.getUiApplication().invokeLater(new Runnable() {
  public void run() {
    // put code in here
  }
});

这一切都说了,我再建议原来的海报搜索,因为我认为有很多这样的样本。在我所看到的样本中,没有人使用等待,所以我不太明白为什么OP一开始就尝试使用等待。如果在一个示例中看到了这一点,请(在评论中)指出它,以便我可以尝试修复它。

票数 3
EN

Stack Overflow用户

发布于 2014-02-19 09:47:39

在关闭自己之前,您可能必须释放所有的锁。将关闭移出同步范围。

此外,还应该将start()放在同步块中,否则线程可能会在到达wait()之前通知()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21876494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档