【问题标题】:AsyncTask needs to longAsyncTask 需要很长
【发布时间】:2013-06-23 06:56:11
【问题描述】:

我有两个相互依赖的异步任务。任务一必须等到任务二完成。因为要检查两者的结果,之后才能继续。我用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 都应该比较结果。如果它们是我想要的,两个任务都将被取消,否则两个任务都将运行另一个时间等等。

【问题讨论】:

  • 为什么不直接在任务一的onPostExecute()中启动任务二呢?
  • 因为那不是我需要的。如果我这样做,并行化就没有意义了。线程一实际上在 while 循环中运行。在第一次运行结束时,它停止并等待任务二。如果任务二完成,任务一将比较结果。如果它们适合,它将继续两个任务,否则它将取消两个任务。

标签: java android parallel-processing android-asynctask threadpool


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2020-08-26
    • 2014-10-09
    • 2012-11-26
    • 2019-12-27
    • 2017-10-22
    • 2020-11-15
    相关资源
    最近更新 更多