多线程应用程序中的同步阻止

时间:2012-11-01 17:29:00

标签: android service input concurrency synchronized

下面你看到一些工作正常的代码 - 但只有一次。它被禁止阻塞直到runOnUIThread完成。它确实如此,当它第一次运行时它被调用。但是当第二次调用时,它会一直运行到最后,然后runOnUIThread开始运行。可能是,在第一次运行方法之后,使用它的线程仍然具有锁定,并且当它第二次调用该方法时,它会运行。这是正确的吗?我该怎么做才能解决这个问题?或者这是一个计时问题,第二次调用者首先获得锁定?

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,控制问题,引脚请求等),并且服务必须显示一些对话框,这些对话框是对前台活动的弱引用回调。由于服务正在执行多个嵌套的while循环,因此比停止重新启动服务更容易同步显示对话框(savind /恢复状态数据会过于复杂)。

1 个答案:

答案 0 :(得分:2)

您可以尝试在Callable内使用FutureTask代替Runnable更好。据我所知,这种组合意味着从线程中提供返回值。

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;
}

CallableRunnable类似,但有返回值。

A FutureTask执行同步并等待结果。与您的wait() / notify()类似。 FutureTask也实施Runnable,因此可用于runOnUiThread