0

我有两个相互依赖的异步任务。任务一必须等到任务二完成。因为要检查两者的结果,之后才能继续。我用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);. 我的信息是THREAD_POOL_EXECUTOR并行执行任务。在任务一结束时,我还执行以下操作来检查另一个变量:

if(!isCancelled())
{
    while(mOther.status)
    {
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    if(checkOtherNodeList(P)) // the results are that what it should be the tasks will be canceled 
    {
        mOther.cancel(true);
        nodesAddedToTrack.addAll(P);
        cancel(true);
        return null;
    }
    synchronized (mOther.status) {
        mOther.status = true;
    }
}

在线程二中,我最后执行以下操作:

if(isCancelled())
{
nodesAddedToTrack.addAll(P);
    nodesAddedToTrack.add(T.get(nodenrfromP));
}
synchronized (status) 
{
status = false;
}
while(!status)
{
if(isCancelled())
    {
    nodesAddedToTrack.addAll(P);
    nodesAddedToTrack.add(T.get(nodenrfromP));
    return null;
}
}

方法 checkOtherNodeList(P) 也适用于同步,否则我会在访问包含结果的两个 ArrayList 时遇到问题。问题是这种并行化的持续时间比我只在一个任务中运行程序的时间长 3-5 倍。这正常吗?同步有问题吗?两个任务都在一个while循环中运行。在 while 循环的每次运行中,Task 都应该比较结果。如果他们是我想要的两个任务都将被取消,否则两者都将运行另一个时间等等。

4

1 回答 1

0

您可以使用 2 个布尔值编写某种状态对象并将其传递给两个 AsyncTask。当 AsyncTasks 完成时,让每个更改 1 个布尔值。在 setter 中,您可以发现其他布尔值是否已更改。在这种情况下,你可以继续。

于 2013-06-26T09:57:02.213 回答