当前位置: 首页 > 知识库问答 >
问题:

除非线程池中的两个asyctask完成其执行,否则继续处理

邬安邦
2023-03-14

我正在使用asynctask并行运行两个异步任务。executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR)

让我们假设task1和task2并行运行,现在只有在task1和task2完成异常时才调用task3来运行。是否可以知道任务task1和task2何时完成工作?

共有2个答案

龚跃
2023-03-14

简单的答案是肯定的。当asyncTask完成其工作时,它调用onPostExecute。所以你可以有两个布尔人

boolean taskOneDone=false;
boolean taskTwoDone=false;

//inside taskOne
@Override onPostExecute(Object obj){
   ...
   taskOneDone=true;
}

//inside taskTwo
@Override onPostExecute(Object obj){
   ...
   taskTwoDone=true;
}

那么在开始任务三之前,你应该检查一下

if(taskOneDone && taskTwoDone) executeTaskThree();
洪鸿博
2023-03-14

我们可以通过使用AsyncTasks的状态来跟踪这两个任务何时完成,以及是否应该在AsyncTasks的任一回调中启动第三个任务来实现这一点。我对它进行了测试,它正常工作,按正确的顺序打印日志。请参阅以下代码。

private AsyncTask<Void, Void, Void> task1 = new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... params) {
        Log.d("Test", "Thread 1");
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        if (task2 != null && task2.getStatus() == Status.FINISHED) {
            task3.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        }
    }
};

private AsyncTask<Void, Void, Void> task2 = new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... params) {
        // Test the correct asynchronous behavior by sleeping thread 2
        //  try {
        //      Thread.sleep(100);
        //  } catch (InterruptedException e) {
        //      e.printStackTrace();
        //  }
        Log.d("Test", "Thread 2");
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        if (task1 != null && task1.getStatus() == Status.FINISHED) {
            task3.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        }
    }
};

private AsyncTask<Void, Void, Void> task3 = new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... params) {
        Log.d("Test", "Thread 3");
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
    }
};

public void randomMethod(){
    task1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    task2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}

我对此进行了测试,日志将按正确的顺序打印:

Test : Thread 1
Test : Thread 2
Test : Thread 3

这种方法可能不适用于所有情况,尤其是当您需要将参数从task1和task2的onPostExecute回调传递给task3时。但是,这种通用解决方案适用于简单的一次性任务,这些任务不依赖于彼此的数据,但需要按照特定的顺序执行。希望这有帮助。

 类似资料:
  • 问题内容: 我有一个应用程序,在某些情况下需要计算某些次数。此计算功能具有@Async注释(来自Spring Framework),可以在4个线程上运行这些计算。问题是我需要大约40000个这些计算,并且我想知道所有计算的开始和结束之间的时间,因此我看到在调用计算函数的for循环之前和之后的时间是什么。但是现在所有计算都放入队列中,因此for循环立即完成,时间大约为1秒,而计算要花几个小时才能完成

  • 我有一个关于CompletableFuture方法的问题: JavaDoc的意思是: 返回一个新的完成阶段,当此阶段正常完成时,将使用此阶段的结果作为所提供函数的参数来执行该阶段。有关异常完成的规则,请参阅完成阶段文档。 穿线呢?这将在哪个线程中执行?如果未来由线程池来完成呢?

  • 问题内容: 我对CompletableFuture方法有疑问: 事情是JavaDoc这么说的: 返回一个新的CompletionStage,当此阶段正常完成时,将使用该阶段的结果作为所提供函数的参数来执行该阶段。有关涵盖异常完成的规则​​,请参见CompletionStage文档。 那线程呢?这将在哪个线程中执行?如果将来由线程池完成怎么办? 问题答案: 文档中指定的策略可以帮助您更好地理解: 对

  • 我有一个关于CompletableFuture方法的问题: 问题是JavaDoc只说了这么一句话: 返回一个新的CompletionStage,当此阶段正常完成时,将以此阶段的结果作为所提供函数的参数执行该CompletionStage。有关例外完成的规则,请参阅CompletionStage文档。 穿线呢?这将在哪个线程中执行?如果未来是由一个线程池来完成的呢?

  • 我如何启动两个线程,其中thread1首先执行,thread2在thread1结束时启动,而主方法线程可以在不锁定其他两个线程的情况下继续工作? 我尝试了join(),但是它需要从线程调用,线程必须等待另一个线程,没有办法执行类似thread2.join(thread1)的操作;因此,如果我在main()中调用join,我将有效地停止主线程的执行,而不仅仅是Thread2的执行。 #编辑:为什么我

  • 我制作了一个程序,要求用户输入5位数字,然后程序将查找这些数字的总和。我想知道我怎样才能使程序在计算一次之后一遍又一遍地要求一个数字。我希望用户再试一次,直到他自己想退出。