【问题标题】:Java start Next loop iteration after inner class has finished内部类完成后Java开始下一个循环迭代
【发布时间】:2018-09-11 20:55:50
【问题描述】:

所以我陷入了一个非常基本的 Java 问题。

即我有一个iteration 需要在inner class 完成后进入下一个循环。但是由于inner class 需要花费大量时间,并且可以在inner class 中访问的variables 必须是final,所以它抛出了RejectedExecutionException

java.util.concurrent.RejectedExecutionException: Task android.os.AsyncTask$3@290074 rejected from java.util.concurrent.ThreadPoolExecutor@d50b99d[Running, pool size = 17, active threads = 17, queued tasks = 128, completed tasks = 42]

这是引发异常的简化解决方案。

for (int i = 0; i < 10;i++) {

        String[] cmd = { "-i",  imageToBeFiltered.toString(), "-filter_complex", filters[loopCounter], imageWithFilter.toString()};

        ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {

            @Override
            public void onSuccess(String message) {
                super.onSuccess(message);

                //Continue loop only if it has reached onSuccess or onFailure

            }
            @Override
            public void onFailure(String message) {
                super.onFailure(message);
                //Continue loop only if it has reached onSuccess or onFailure
            }
        });
    }
}

当执行正常的fori-loop 时,它并不总是等待所有terminal calls 完成并继续。

【问题讨论】:

  • ffmpeg.execute 正在为每次迭代在池中创建一个新线程,您似乎也用完了线程。例如,在AsyncTask 上进行计算或使用线程Executor 来限制您的池等。目前还不清楚您要问什么,或者……确切地说是您实际尝试了什么。
  • @MartinMarconcini 好吧,我尝试通过展示我所做的来展示我的要求,这样更容易理解吗?

标签: java android for-loop


【解决方案1】:

你考虑过递归吗?

void myMethod(int index) {
    String[] cmd = { "-i",  imageToBeFiltered.toString(), "-filter_complex", filters[loopCounter], imageWithFilter.toString()};

    ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {

        @Override
        public void onSuccess(String message) {
            super.onSuccess(message);

            if (index < 10) myMethod(index++);

        }
        @Override
        public void onFailure(String message) {
            super.onFailure(message);

            if (index < 10) myMethod(index++);
        }
    });
}

编辑:

我猜loopCounter 应该是索引,在这种情况下,如果您使用此代码,您会想要更改它。

【讨论】:

  • 这确实有效,因为我需要它来工作,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2018-04-21
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多