【问题标题】:How to synchronize two async task?如何同步两个异步任务?
【发布时间】:2013-09-20 10:02:37
【问题描述】:

我的问题是我有两个异步任务,它们执行一种矩阵乘法。因此,这两个任务都在访问同一个矩阵。一个上半部分,另一个下半部分。对于内存节省问题,我使用 ArrayLists 并删除不再需要的条目。问题是在这两个任务中都有 for 循环运行,并且在这个循环结束时它应该等待另一个任务。但我不知道该怎么做。 任务一:

protected Void doInBackground(Void... paramArrayOfParams) {
        android.os.Debug.waitForDebugger();
        for(j=1; j<(size+1); j++)
        {
            .... 
            try{ othertask.wait();
            }catch(InterruptedException e){}
            //wait for other task();
        }

任务 2:

protected Void doInBackground(Void... paramArrayOfParams) {
            android.os.Debug.waitForDebugger();
            for(j=1; j<(size+1); j++)
            {
                ....
                notifyAll();
                //notifythatroundisfinished();
            }

我尝试使用通知并等待,但这似乎并不能解决问题。我不知道可以用来解决问题的任何其他方法。是否真的可以在两个都运行时等待另一个任务?

【问题讨论】:

    标签: java android multithreading asynchronous android-asynctask


    【解决方案1】:

    我相信以下问题的答案可以为您提供有关如何管理多个异步任务的抽象信息。

    How to manage multiple Async Tasks efficiently in Android

    Running multiple AsyncTasks at the same time -- not possible?

    和github例子:

    https://github.com/vitkhudenko/test_asynctask(感谢:vitkhudenko)

    【讨论】:

    • 我已经浏览了这些链接,但之前没有找到答案,这就是我发布这个问题的原因。我需要一个同步,它在每个 for 循环运行结束时等待,直到另一个任务位于同一位置,然后两者都将从 for 循环的下一次运行开始。
    【解决方案2】:

    如果这是 Java-7,您正在寻找 Phaser。您需要的方法是arriveAndAwaitAdvance。

    在早期版本的 Java(5.1 或更高版本)中,您可能会使用 Semaphore。

    或者 - 您可以切换到使用线程池,例如 ExecutorService 和 Futures。这将更具可扩展性,并能更好地利用多核处理器。

    【讨论】:

    • 我正在寻找兼容安卓异步任务的解决方案。
    • 那么也许我建议Semaphore是对的。
    • 为什么这个答案被标记为正确?我遇到了 Android 内部循环器的问题。如果我在一个线程中调用 await(),则异步线程被阻塞。
    猜你喜欢
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多