首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程应用程序中的同步阻塞

多线程应用程序中的同步阻塞
EN

Stack Overflow用户
提问于 2012-11-02 01:29:00
回答 1查看 191关注 0票数 2

下面你会看到一些运行良好的代码--但只有一次。它被禁止在runOnUIThread完成之前阻塞。当它第一次被调用时,它就会这样做。但当第二次调用时,它会一直运行到最后,然后runOnUIThread开始运行。有可能是,在方法第一次运行后,调用它的线程仍然拥有锁,当它第二次调用该方法时,它会遍历。是这样的吗?我能做些什么来解决这个问题呢?或者这是一个计时问题,第二次调用者首先获得锁?

代码语言:javascript
复制
static Integer syn = 0;
@Override 
public String getTanFromUser(long accid, String prompt) {
    // make parameters final
    final long accid_int = accid;
    final String prompt_int = prompt;
    Runnable tanDialog = new Runnable() {
        public void run() {
            synchronized(syn) {
                tanInputData = getTANWithExecutionStop(TransferFormActivity.this);
                syn.notify() ;
            }
        }
    };
    synchronized(syn) {
        runOnUiThread(tanDialog);
        try {syn.wait();} 
        catch (InterruptedException e) {} 
    }
    return tanInputData;
}

背景:调用此方法的线程是绑定服务中的异步任务,该服务在后台与银行进行事务处理。在不定期中断时,银行发送用户验证请求(captche、控制问题、pin请求等)并且服务必须通过对前台活动的弱引用回调来显示一些对话框。由于服务正在执行多个嵌套的while循环,因此同步显示对话框比停止并重新启动服务更容易(保存/恢复状态数据太复杂)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-02 02:33:16

如果在FutureTask中使用Callable比在Runnable中使用更好,您可以尝试一下。据我所知,这种组合是为了提供线程的返回值。

代码语言:javascript
复制
public String getTanFromUser(long accid, String prompt) {
    // make parameters final
    final long accid_int = accid;
    final String prompt_int = prompt;
    Callable<String> tanDialog = new Callable<String>() {
        public String call() throws Exception {
            return getTANWithExecutionStop(TransferFormActivity.this);
        }
    };
    FutureTask<String> task = new FutureTask<String>(tanDialog);
    runOnUiThread(task);
    String result = null;
    try {
        result = task.get();
    }
    catch (InterruptedException e) { /* whatever */ }
    catch (ExecutionException e) { /* whatever */ }
    return result;
}

Callable类似于Runnable,但有一个返回值。

FutureTask执行同步并等待结果。类似于您的wait() / notify()FutureTask还实现了Runnable,因此可以将其用于runOnUiThread

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

https://stackoverflow.com/questions/13182397

复制
相关文章

相似问题

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